Scala 折叠Spark数据帧
我正在将Spark与Scala一起使用。Spark版本1.5,我正在尝试将具有名称-值组合的输入数据帧转换为一个新的数据帧,在该数据帧中,所有名称都将转换为列,值作为行 I/p数据帧:Scala 折叠Spark数据帧,scala,apache-spark,dataframe,apache-spark-sql,pivot,Scala,Apache Spark,Dataframe,Apache Spark Sql,Pivot,我正在将Spark与Scala一起使用。Spark版本1.5,我正在尝试将具有名称-值组合的输入数据帧转换为一个新的数据帧,在该数据帧中,所有名称都将转换为列,值作为行 I/p数据帧: ID名称值 美国1国 美国2个国家 2纽约州 英国三国 四国印度 4州MH 美国5国 5新泽西州 哈德逊郡5号 转置数据帧 ID国家/州/县 1 US NULL NULL 2美国纽约州零 3英国空 4印度MH空 5美国新泽西州哈德逊 在这个用例中,pivot似乎会有所帮助,但spark 1.5.x版本不支
ID名称值
美国1国
美国2个国家
2纽约州
英国三国
四国印度
4州MH
美国5国
5新泽西州
哈德逊郡5号
转置数据帧
ID国家/州/县
1 US NULL NULL
2美国纽约州零
3英国空
4印度MH空
5美国新泽西州哈德逊
在这个用例中,pivot似乎会有所帮助,但spark 1.5.x版本不支持pivot
有任何提示/帮助吗?这是一个非常难看的数据,但您始终可以筛选并加入:
val names = Seq("Country", "State", "County")
names.map(name =>
df.where($"Name" === name).select($"ID", $"Value".alias("name"))
).reduce((df1, df2) => df1.join(df2, Seq("ID"), "leftouter"))
map
创建一个包含三个DataFrames
的列表,其中每个表只包含一个名称的记录。接下来,我们简单地使用左外连接减少这个列表。因此,把所有这些放在一起,你会得到如下结果:
(left-outer-join
(left-outer-join
(where df (=== name "Country"))
(where df (=== name "State")))
(where df (=== name "County")))
注意:如果将Spark>=1.6与Python或Scala一起使用,或将Spark>=2.0与R一起使用,只需先将pivot与一起使用
: