【问题标题】:Concatenate keys with first element in the values array in a MapType column将键与 MapType 列中值数组中的第一个元素连接起来
【发布时间】:2021-04-09 14:43:42
【问题描述】:

数据框的架构如下所示。

|-- idMap: map (nullable = true)
|    |-- key: string
|    |-- value: array (valueContainsNull = true)
|    |    |-- element: struct (containsNull = true)
|    |    |    |-- id: string (nullable = true)
|    |    |    |-- linked: boolean (nullable = true)

例如,如果一行中有 3 个键,我正在尝试将其转换为格式为 key1:id;key2:id;key3:id 的新字符串列,其中 id 是索引 0 处元素的一部分。

我试过的是

  1. 收集到列表的键
  2. 从键列表创建列列表
val expr = new scala.collection.mutable.ListBuffer[org.apache.spark.sql.Column]
keyList.foldLeft(expr)((expr, key) => expr += (lit(key), lit(":"), col("idMap")(key)(0)("id"), lit(";")))
  1. 使用传递给 concat 的列列表添加一个新列
val finalDf = df.withColumn("concatColumn", concat(expr.toList:_*))

它给了我一个空列,所以我假设这种方法有缺陷。任何意见将不胜感激。

编辑:@mck 的回答有效。在第 3 步中使用 concat_ws 也可以。

val finalDf = df.withColumn("concatColumn", concat_ws(expr.toList:_*))

【问题讨论】:

    标签: scala dataframe apache-spark apache-spark-sql


    【解决方案1】:

    如果您有 Spark 3,则可以使用 transform_values 转换地图列以获得所需的输出。

    // sample dataframe
    val df = spark.sql("select map('key1', array(struct('id1' id, true linked)), 'key2', array(struct('id2' id, false linked))) idMap")
    
    val df2 = df.withColumn(
        "concatColumn", 
        expr("""
            concat_ws(';', 
                map_values(
                    transform_values(
                        idMap, 
                        (k, v) -> concat(k, ':', transform(v, y -> y.id)[0])
                    )
                )
            ) 
        """)
    )
    
    df2.show(false)
    +-----------------------------------------------+-----------------+
    |idMap                                          |concatColumn     |
    +-----------------------------------------------+-----------------+
    |[key1 -> [[id1, true]], key2 -> [[id2, false]]]|key1:id1;key2:id2|
    +-----------------------------------------------+-----------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多