我正在使用 Spark with Scala 。 Spark版本 1.5 ,我正在尝试将具有名称值组合的输入数据帧转换为新数据帧,其中所有名称都要转换为列,值为行。
I / P DataFrame:
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
Transposed 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版本中不受支持。
任何指针/帮助?
答案 0 :(得分:4)
这是一个非常难看的数据,但您可以随时过滤和加入:
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")))
注意:如果您使用Spark> = 1.6与Python或Scala,或Spark> = 2.0与R,只需使用与first
的轴: