我在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结合使用:
  • Reshaping/Pivoting data in Spark RDD and/or Spark DataFrames
  • How to pivot DataFrame?
  • 10-07 13:12
    查看更多