scala – SparkSQL Dataframe函数是否会爆炸保留顺序?
发布时间:2020-12-16 18:14:45 所属栏目:安全 来源:网络整理
导读:我有一个 Scala spark DataFrame: df.select($"row_id",$"array_of_data").show+----------+--------------------+| row_id | array_of_data |+----------+--------------------+| 0 | [123,ABC,G12] || 1 | [100,410] || 2 | [500,300,...] | 我想爆炸这些
我有一个
Scala spark DataFrame:
df.select($"row_id",$"array_of_data").show +----------+--------------------+ | row_id | array_of_data | +----------+--------------------+ | 0 | [123,ABC,G12] | | 1 | [100,410] | | 2 | [500,300,...] | 我想爆炸这些数组,以便每个元素都在不同的行中,但我还想标记哪一行对应于数组的第一个元素: +----------+--------------------+----------+----------+ | row_id | array_of_data | exploded | is_first | +----------+--------------------+----------+----------+ | 0 | [123,G12] | 123 | Yes | | 0 | [123,G12] | ABC | No | | 0 | [123,G12] | G12 | No | 为实现这一点,我使用explode function,并希望第一行对应第一个数据元素: var exploded_df = df.withColumn("exploded",explode($"array_of_data")) val window = Window.partitionBy("row_id").orderBy("row_id") // Create an internal rank variable to figure out the first element exploded_df = exploded_df.withColumn("_rank",row_number().over(window)) exploded_df = exploded_df.withColumn("is_first",when(($"_rank" === 1),"Yes").otherwise("No") ) 这似乎适用于我的目的并产生所需的输出,但我相信这将始终有效吗?我无法在爆炸文档中找到承诺此行为的任何地方,并且信任Spark数据帧中的行顺序似乎是不明智的. 我能想到的唯一其他解决方案是为array_of_data中的每个元素创建一个新列,然后在爆炸时匹配第一列中的值,但我不能保证不会出现重复值数组. 解决方法
您可以使用
posexplode功能.
正如api文档所解释的那样
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |