如何修改具有复杂嵌套结构的Spark Dataframe?

2023-11-22

我有一个复杂的 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)
)

我想生成一个具有该字段的新 DFdata.valueMapType 设置为 null,但由于这是数组的元素,我无法弄清楚如何设置。我认为它会类似于:

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

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


从 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修改具有复杂嵌套结构的Spark Dataframe? 的相关文章

随机推荐