收合Spark DataFrame

Lea*_*ner 5 pivot scala dataframe apache-spark apache-spark-sql

我在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  
Run Code Online (Sandbox Code Playgroud)

在此处链接以获取图像

转置的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  
Run Code Online (Sandbox Code Playgroud)

链接到转置后的图像
似乎在这种用例中像数据透视一样会有所帮助,但spark 1.5.x版本不支持此功能。

有指针/帮助吗?

zer*_*323 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"))
Run Code Online (Sandbox Code Playgroud)

map创建一个包含三个的列表DataFrames,其中每个表包含仅包含一个名称的记录。接下来我们reduce使用左外连接简单地列出这个列表。所以把它们放在一起你会得到这样的东西:

(left-outer-join
  (left-outer-join 
    (where df (=== name "Country"))
    (where df (=== name "State")))
  (where df (=== name "County")))
Run Code Online (Sandbox Code Playgroud)

注意:如果您将 Spark >= 1.6 与 Python 或 Scala 一起使用,或者 Spark >= 2.0 与 R 一起使用,则只需将枢纽与first