我有一个数据帧,其架构如下所示:
event: struct (nullable = true)
| | event_category: string (nullable = true)
| | event_name: string (nullable = true)
| | properties: struct (nullable = true)
| | | ErrorCode: string (nullable = true)
| | | ErrorDescription: string (nullable = true)
我正在尝试使用以下代码展开struct
列properties
:
df_json.withColumn("event_properties", explode($"event.properties"))
但它抛出以下异常:
cannot resolve 'explode(`event`.`properties`)' due to data type mismatch: input to function explode should be array or map type, not StructType(StructField(IDFA,StringType,true),
如何展开专栏properties
?
答案 0 :(得分:5)
您可以在explode
或array
列中使用map
,因此您需要将properties
struct
转换为{ {1}}然后应用array
功能,如下所示
explode
你应该有你想要的要求
答案 1 :(得分:1)
如错误消息所示,您只能爆炸数组或地图类型,而不是结构类型列。
你可以做到
df_json.withColumn("event_properties", $"event.properties")
这将生成一个新列event_properties
,它也是struct-type
如果要将结构体的每个元素转换为新列,则无法使用withColumn
,需要使用通配符select
执行*
:
df_json.select($"event.properties.*")
答案 2 :(得分:0)
您可以使用以下来展平结构。爆炸不适用于struct作为错误消息状态。
val explodeDF = parquetDF.explode($"event") {
case Row(properties: Seq[Row]) => properties.map{ property =>
val errorCode = property(0).asInstanceOf[String]
val errorDescription = property(1).asInstanceOf[String]
Event(errorCode, errorDescription, email, salary)
}
}.cache()
display(explodeDF)