scala – 如何使用复杂的嵌套结构修改Spark Dataframe?
发布时间:2020-12-16 18:50:22 所属栏目:安全 来源:网络整理
导读:我有一个复杂的DataFrame结构,并希望轻松地使列无效.我已经创建了隐式类来连接功能并轻松地解决2D DataFrame结构,但是一旦DataFrame变得更复杂,使用ArrayType或MapType,我就没有太多运气了.例如: 我将架构定义为: StructType( StructField(name,StringType
我有一个复杂的DataFrame结构,并希望轻松地使列无效.我已经创建了隐式类来连接功能并轻松地解决2D DataFrame结构,但是一旦DataFrame变得更复杂,使用ArrayType或MapType,我就没有太多运气了.例如:
我将架构定义为: StructType( StructField(name,StringType,true),StructField(data,ArrayType( StructType( StructField(name,StructField(values,MapType(StringType,true) ),true ),true) ) 我想生成一个新的DF,它将MapType的字段data.value设置为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],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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |