我正在向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)。否则(...)模式。任何帮助将不胜感激!谢谢!
答案 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