【问题标题】:Spark scala get an array of type string from multiple columnsSpark scala 从多列中获取字符串类型的数组
【发布时间】:2017-03-12 05:25:57
【问题描述】:

我在 scala 中使用 spark。

想象一下输入:

我想知道如何获得以下输出 [参见下图中的列累加器],它应该是 String Array[String] 类型的数组

在我的真实数据框中,我有超过 3 列。我有几千列。

如何才能获得所需的输出?

【问题讨论】:

    标签: arrays string scala apache-spark accumulator


    【解决方案1】:

    您可以使用array 函数并映射一系列列:

    import org.apache.spark.sql.functions.{array, col, udf} 
    
    val tmp = array(df.columns.map(c => when(col(c) =!= 0, c)):_*)
    

    在哪里

    when(col(c) =!= 0, c)
    

    如果列值不为零,则取一个列名,否则为空。

    并使用 UDF 过滤空值:

    val dropNulls = udf((xs: Seq[String]) => xs.flatMap(Option(_)))
    df.withColumn("accumulator", dropNulls(tmp))
    

    所以用示例数据:

    val df = Seq((1, 0, 1), (0, 1, 1), (1, 0, 0)).toDF("apple", "orange", "kiwi")
    

    你首先得到:

    +-----+------+----+--------------------+
    |apple|orange|kiwi|                 tmp|
    +-----+------+----+--------------------+
    |    1|     0|   1| [apple, null, kiwi]|
    |    0|     1|   1|[null, orange, kiwi]|
    |    1|     0|   0| [apple, null, null]|
    +-----+------+----+--------------------+
    

    最后:

    +-----+------+----+--------------+
    |apple|orange|kiwi|   accumulator|
    +-----+------+----+--------------+
    |    1|     0|   1| [apple, kiwi]|
    |    0|     1|   1|[orange, kiwi]|
    |    1|     0|   0|       [apple]|
    +-----+------+----+--------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2022-01-08
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多