【问题标题】:Array operations in a map function : Spark 1.6映射函数中的数组操作:Spark 1.6
【发布时间】:2020-11-13 19:49:03
【问题描述】:

我有一列是结构类型的包装数组,带有一个整数和一个双精度值。

架构如下所示:

 |-- pricing_data: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _1: integer (nullable = false)
 |    |    |-- _2: double (nullable = false)

因此,每当此列值为 [[0,0.0]] 时,我都需要将其更改为空数组。 [[0,0.0]] -> [[]]。

如何使用地图做到这一点?还是使用数据框?

【问题讨论】:

    标签: scala dataframe apache-spark user-defined-functions


    【解决方案1】:

    试试这个- spark>=2.4

       val df = Seq(Seq((0, 0.0)), Seq((1, 2.2))).toDF("pricing_data")
        df.show(false)
        df.printSchema()
    
        /**
          * +------------+
          * |pricing_data|
          * +------------+
          * |[[0, 0.0]]  |
          * |[[1, 2.2]]  |
          * +------------+
          *
          * root
          * |-- pricing_data: array (nullable = true)
          * |    |-- element: struct (containsNull = true)
          * |    |    |-- _1: integer (nullable = false)
          * |    |    |-- _2: double (nullable = false)
          */
    
        df.withColumn("pricing_data", expr(
        "TRANSFORM(pricing_data, x -> if(x._1=0 and x._2=0.0, named_struct('_1', null, '_2', null), x))"
        ))
          .show(false)
    
        /**
          * +------------+
          * |pricing_data|
          * +------------+
          * |[[,]]       |
          * |[[1, 2.2]]  |
          * +------------+
          */
    

    spark<2.4

     // spark<2.4
        val dataType = df.schema("pricing_data").dataType
       val replace =  udf((arrayOfStruct: mutable.WrappedArray[Row]) => {
          arrayOfStruct.map(row => {
            val map = row.getValuesMap(row.schema.map(_.name))
            if(map("_1")==0 && map("_2") == 0.0) {
              Row.fromTuple((null, null))
            } else row
          })
        }, dataType)
    
        df.withColumn("pricing_data", replace($"pricing_data"))
            .show(false)
    
        /**
          * +------------+
          * |pricing_data|
          * +------------+
          * |[[,]]       |
          * |[[1, 2.2]]  |
          * +------------+
          */
    

    【讨论】:

    • 基本上你试图将列的元数据从array&lt;struct&lt;2 cols&gt;&gt;更改为array&lt;struct&lt;1 cols&gt;&gt;,如果数据框中只有一行具有值[[0, 0.0]],那么是,否则不是。您需要想出策略来加入列_1_2 以将其转换为一个
    • 线程“main”中的异常 java.lang.RuntimeException: [1.28] 失败:标识符预期 TRANSFORM(pricing_data, x -> if(x._1=0 and x._2=0.0, named_struct( '_1', null, '_2', null), x)) ^ 在“->”处抛出错误
    • 你在 spark >= 2.4 吗?
    • 不,我使用的是 spark 1.6。我的集群有旧版本的 Spark。
    • 嗨,我无法将数据类型应用于该行。不能应用于 (scala.collection.mutable.WrappedArray[org.apache.spark.sql.Row] => scala.collection.mutable.WrappedArray[org.apache.spark.sql.Row], org.apache.spark. sql.types.DataType)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2017-10-13
    • 2015-06-29
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多