Scala Spark将多列中的值聚合到新列

时间:2017-09-12 14:27:52

标签: sql scala apache-spark cassandra

我正在向Cassandra进行SQL迁移,并且遇到将多个列组合到一个列中的问题。例如,假设我有一个人可以参加一场或多场比赛。我目前每场比赛都有0或1。我怎样才能将它组合成一个列作为Set?

             SQL Schema
+----------------------------------+
- R_White R_Af_American R_Asian    -
-   1          1           1       -
-   0          1           1       -
-   1          0           1       -
-   0          1           0       -
+----------------------------------+

                   Cassandra Temp Desired Schema
+-------------------------------------------------------------------+
- R_White R_Af_American R_Asian          Race                       -
-   1          1           1        ["White","Af American", "Asian"]-
-   0          1           1        ["Af American", "Asian"]        -
-   1          0           1        ["White", "Asian"]              -
-   0          1           0        ["Af American"]                 -
+-------------------------------------------------------------------+

由于我正在读取来自csv的数据,因此我计划从SQL中读取表格中的Spark,执行组合(进入Race列),然后删除除新Race列之外的所有列。

我一直在链接.withColumn()对数据进行其他数据操作,但这似乎不适合何时(col(" R_White")=== 1,somehow_add_to_set)。否则(...)模式。任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是使用array函数为每个值创建一个数组,然后使用UDF删除when

null

您还可以通过将DataFrame的列名映射到这些import org.apache.spark.sql.functions._ import spark.implicits._ val dropNulls = udf { (a: Seq[String]) => a.filter(_ != null) } val result = df.withColumn("Race", dropNulls(array( when($"R_White" === 1, "R_White"), when($"R_Af_American" === 1, "R_Af_American"), when($"R_Asian" === 1, "R_Asian") ))) 表达式来摆脱硬编码值:

when