在Scala中等效R的reshape2 :: melt()?

时间:2018-01-11 23:33:23

标签: scala apache-spark dataframe melt

我有一个数据框,我想使用Scala使用多列中的值将行分解为多行。理想情况下,我希望复制R函数melt()的行为。

所有列都包含Strings

示例:我想转换此数据框..

df.show
+--------+-----------+-------------+-----+----+
|col1    | col2       | col3       | res1|res2|
+--------+-----------+-------------+-----+----+
|       a|    baseline| equivalence| TRUE| 0.1|
|       a| experiment1| equivalence|FALSE|0.01|
|       b|    baseline| equivalence| TRUE| 0.2|
|       b| experiment1| equivalence|FALSE|0.02|
+--------+-----------+-------------+-----+----+

...进入此数据框:

+--------+-----------+-------------+-----+-------+
|col1    | col2      | col3        | key  |value|
+--------+-----------+-------------+-----+-------+
|       a|   baseline|  equivalence| res1 | TRUE |
|       a|experiment1|  equivalence| res1 | FALSE|
|       b|   baseline|  equivalence| res1 | TRUE |
|       b|experiment1|  equivalence| res1 | FALSE|
|       a|   baseline|  equivalence| res2 | 0.1  |
|       a|experiment1|  equivalence| res2 | 0.01 |
|       b|   baseline|  equivalence| res2 | 0.2  |
|       b|experiment1|  equivalence| res2 | 0.02 |
+--------+-----------+-------------+-----+-------+
  • Scala中是否有内置函数适用于数据集或 数据帧这样做?
  • 如果没有,它会相对简单吗? 实现这个?如何在高层次上完成?

注意:我从SMV找到了类UnpivotOp,它可以完全符合我的要求:(https://github.com/TresAmigosSD/SMV/blob/master/src/main/scala/org/tresamigos/smv/UnpivotOp.scala)。

不幸的是,这个课是私人的,所以我做不到这样的事情:

import org.tresamigos.smv.UnpivotOp
val melter = new UnpivotOp(df,  Seq("res1","res2"))
val melted_df = melter.unpivot()

有没有人知道是否有办法通过某些其他类型的SMV静态方法访问类org.tresamigos.smv.UnpivotOp

谢谢!

1 个答案:

答案 0 :(得分:0)

感谢Andrew's Ray answerunpivot in spark-sql/pyspark 这就是诀窍:

df.select($"col1",
          $"col2",
          $"col3",
          expr("stack(2, 'res1', res1, 'res2', res2) as (key, value)"))

或者,如果select的表达式应该作为字符串传递(方便df %>% sparklyr::invoke("")):

df.selectExpr("col1", 
              "col2", 
              "col3",
              "stack(2, 'res1', res1, 'res2', res2) as (key, value)")