我在Scala 中使用 Spark。 Spark版本 1.5 ,我正在尝试将具有名称值组合的输入数据框转换为新的数据框,在该数据框中,所有名称都将转换为列和值作为行。
I/P数据帧:
ID Name Value
1 Country US
2 Country US
2 State NY
3 Country UK
4 Country India
4 State MH
5 Country US
5 State NJ
5 County Hudson
Link here for image
转置的DataFrame
ID Country State County
1 US NULL NULL
2 US NY NULL
3 UK NULL NULL
4 India MH NULL
5 US NJ Hudson
Link to transposed image
似乎在这种用例中,pivot会有所帮助,但spark 1.5.x版本不支持它。
有指针/帮助吗?
最佳答案
这是一个非常丑陋的数据,但是您始终可以过滤并加入:
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
的列表,其中每个表包含仅包含一个名称的记录。接下来,我们简单地使用左外部联接对该列表进行reduce
编码。因此,将所有这些放在一起,您将得到如下所示的内容:(left-outer-join
(left-outer-join
(where df (=== name "Country"))
(where df (=== name "State")))
(where df (=== name "County")))
注意:如果在Python或Scala中使用Spark> = 1.6,或者在R中使用Spark> = 2.0,只需将ivot与
first
结合使用: