我有一个数据框,其中每一行都是成对的列表。例如,我有一个数据框df,看起来像这样:
id | pairs
1 | (a, b), (b, c), (a, c)
2 | (a, b), (b, d)
3 | (b, c)
id: Int
pairs: Array<Struct<String,String>>
处理后,数据框应如下所示:
pairs |
(a, b) |
(b, c) |
(a, c) |
(a, b) |
(b, d) |
(b, c) |
我实际上并不需要id
列,因此丢弃数据帧的所有其他列的解决方案也可以使用。还请注意,不能从数据框中删除重复项。如果一对有3个实例,则在新数据框中需要全部3个实例。
我尝试过逐个遍历内容并将它们添加到全局列表中,但是这种方法太慢了。 (我最终要运行一个Spark作业,在该作业中我需要此位来进行一些预处理。)是否存在一种有效的方法,而不必遍历数据帧每一行中每个列表的每个元素?
对此表示感谢!
答案 0 :(得分:3)
您可以使用drop函数删除id
列,并使用explode在不同的行中创建每个元组:
val initialDf= ....
val dfAfterDrop=initialDf.drop("id")
val dfAfterExplode = dfAfterDrop.withColumn("pairsExplode", explode($"pairs"))
现在您的pairsExplode
列包含所有元组,每个元组在不同的行中。
您可以再次使用pairs
来删除原始的drop
列。
更优雅的方式-感谢@Hristo Iliev:
initialDf.select(explode($"pairs") as "pairs")