【问题标题】:Scala Spark aggregating values from multiple columns into new columnScala Spark将多个列中的值聚合到新列中
【发布时间】:2018-02-21 01:46:23
【问题描述】:

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

             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() 以对数据进行其他数据操作,但这似乎不适合 when(col("R_White") === 1,不知何故_add_to_set).otherwise(...) 模式.任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 你能提供表的架构以及你想添加什么到集合中吗?
  • 以上这个是不是更清楚了?我编辑了表格并添加了对我的场景的更多解释
  • Tzach 已经回答过了。这没有帮助吗?

标签: sql scala apache-spark cassandra


【解决方案1】:

实现此目的的一种方法是使用array 函数和when 表达式为每个值创建一个数组,然后使用UDF 删除nulls:

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")
)))

您还可以通过将 DataFrame 的列名映射到这些 when 表达式来摆脱硬编码值:

val result = df.withColumn("Race", dropNulls(array(
  df.columns.map(name => when(col(name) === 1, name)): _*
)))

result.show(false)
// +-------+-------------+-------+---------------------------------+
// |R_White|R_Af_American|R_Asian|Race                             |
// +-------+-------------+-------+---------------------------------+
// |1      |1            |1      |[R_White, R_Af_American, R_Asian]|
// |0      |1            |1      |[R_Af_American, R_Asian]         |
// |1      |0            |1      |[R_White, R_Asian]               |
// |0      |1            |0      |[R_Af_American]                  |
// +-------+-------------+-------+---------------------------------+

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2018-03-02
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多