折叠Spark DataFrame

时间:2016-03-02 04:18:22

标签: scala apache-spark dataframe apache-spark-sql pivot

我正在使用 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  

Link here for image

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版本中不受支持。

任何指针/帮助?

1 个答案:

答案 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的轴: