在Spark中爆炸struct列时出错

时间:2018-01-18 06:55:32

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

我有一个数据帧,其架构如下所示:

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)

我正在尝试使用以下代码展开structproperties

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

3 个答案:

答案 0 :(得分:5)

您可以在explodearray 中使用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)