我有以下动态创建的Spark数据框
|名称|号|
+ -------- + --------- +
|安迪| (20,10,30)|
|贝塔| (30,40,20)|
|乔| (40,90,60)|
+ ------- + --------- +
现在,我需要迭代Spark中的每一行和每一列,以打印以下输出,该怎么做?
安迪20
安迪10
安迪30
贝尔塔30
贝尔塔40
贝尔塔20
乔40
乔90
乔60
答案 0 :(得分:0)
您需要爆炸功能。 Here samples of its usage.
答案 1 :(得分:0)
假设数字列的数据类型为字符串,则可以按照以下步骤获得所需的结果。
原始数据框:
val df = Seq(("Andy", "20,10,30"), ("Berta", "30,40,20"), ("Joe", "40,90,60"))
.toDF("name", "number")
然后通过用逗号分隔数字列来创建具有3个数字列的中间数据框。
val Interim_Df = df.withColumn("n1", split(col("number"), ",").getItem(0))
.withColumn("n2", split(col("number"), ",").getItem(1))
.withColumn("n3", split(col("number"), ",").getItem(2))
.drop("number")
然后通过与oneIndexDfs合并来生成最终结果数据帧。
val columnIndexes = Seq(1, 2, 3)
val onlyOneIndexDfs = columnIndexes.map(x =>
Interim_Df.select(
$"name",
col(s"n$x").alias("number")))
val resultDF = onlyOneIndexDfs.reduce(_ union _)