【问题标题】:How to modify a Spark Dataframe with a complex nested structure?如何修改具有复杂嵌套结构的 Spark Dataframe?
【发布时间】:2019-12-11 21:10:33
【问题描述】:

我有一个复杂的 DataFrame 结构,想轻松地将一列清空。我创建了隐式类来连接功能并轻松解决 2D DataFrame 结构,但是一旦 DataFrame 变得更加复杂,ArrayType 或 MapType 我就没有太多运气了。例如:

我将架构定义为:

StructType(
    StructField(name,StringType,true), 
    StructField(data,ArrayType(
        StructType(
            StructField(name,StringType,true), 
            StructField(values,
                MapType(StringType,StringType,true),
            true)
        ),
        true
    ),
    true)
)

我想生成一个新的 DF,其中 MapType 的字段 data.value 设置为 null,但由于这是数组的一个元素,我无法弄清楚如何。我认为它类似于:

df.withColumn("data.values", functions.array(functions.lit(null)))

但这最终会创建一个data.values 的新列,并且不会修改数据数组的values 元素。

【问题讨论】:

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


    【解决方案1】:

    从 Spark 1.6 开始,您可以使用案例类来映射您的数据框(称为数据集)。然后,您可以映射您的数据并将其转换为您想要的新模式。例如:

    case class Root(name: String, data: Seq[Data])
    case class Data(name: String, values: Map[String, String])
    case class NullableRoot(name: String, data: Seq[NullableData])
    case class NullableData(name: String, value: Map[String, String], values: Map[String, String])
    
    val nullableDF = df.as[Root].map { root =>
      val nullableData = root.data.map(data => NullableData(data.name, null, data.values))
      NullableRoot(root.name, nullableData)
    }.toDF()
    

    nullableDF 的结果架构将是:

    root
     |-- name: string (nullable = true)
     |-- data: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- name: string (nullable = true)
     |    |    |-- value: map (nullable = true)
     |    |    |    |-- key: string
     |    |    |    |-- value: string (valueContainsNull = true)
     |    |    |-- values: map (nullable = true)
     |    |    |    |-- key: string
     |    |    |    |-- value: string (valueContainsNull = true)
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并假设您不需要结果来拥有任何新字段或具有不同类型的字段,这是一个无需重新定义整个结构即可做到这一点的解决方案:Change value of nested column in DataFrame

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 2019-06-06
        • 2020-09-23
        相关资源
        最近更新 更多