如何拆分作为数据框一部分的列表的内容?

时间:2019-06-25 05:36:36

标签: scala apache-spark

我有一个数据框,其中每一行都是成对的列表。例如,我有一个数据框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作业,在该作业中我需要此位来进行一些预处理。)是否存在一种有效的方法,而不必遍历数据帧每一行中每个列表的每个元素?

对此表示感谢!

1 个答案:

答案 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")