【问题标题】:Spark: How to collect a single column from an ArrayType of columns to a different array?Spark:如何将列的 ArrayType 中的单列收集到不同的数组?
【发布时间】:2021-06-23 16:10:40
【问题描述】:

我有一个名为 requests 的列,它属于 ArrayType,其中包含一些字段,例如 codevalue

StructField(requests,ArrayType(StructType(StructField(code,IntegerType,true), StructField(value,DoubleType,true) .....)

比如[[1, 5.0....], [2, 0, ....]] 等等。

如何只收集数组中的 code 字段,以便只得到 [1,2....]?我对requests 中的其他字段不感兴趣。

我尝试使用 array_zip 但这没有帮助:

val result = df.withColumn("new_col", arrays_zip(col("requests.code")))

我必须使用explode 吗?或者这可能使用高阶函数吗?提前致谢!

【问题讨论】:

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


    【解决方案1】:

    对于 Spark >= 2.4,您可以使用高阶函数 transform

    val result = df.withColumn("new_col", expr("transform(requests, x -> x.code)"))
    

    如果您的 Spark >= 3.0,您还可以使用 Scala 数据框 API transform

    val result = df.withColumn("new_col", transform(col("requests"), x => x("code")))
    
    // or more simply
    val result = df.withColumn("new_col", transform(col("requests"), _("code")))
    

    【讨论】:

      【解决方案2】:

      您可以通过访问requests 数组中的字段直接获得code 值的数组:

      val result = df.withColumn("new_col", col("requests")("code"))
      

      或者通过使用列方法getItemgetField

      val result = df.withColumn("new_col", col("requests").getField("code"))
      

      例子:

      result.show(false)
      //+----------------------------------------+------------+
      //|requests                                |new_col     |
      //+----------------------------------------+------------+
      //|[[1, 1.5], [2, 2.5], [3, 3.5], [4, 4.5]]|[1, 2, 3, 4]|
      //+----------------------------------------+------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        相关资源
        最近更新 更多