Pyspark 结构列:爆炸后的奇怪行为
Pyspark Struct columns: weird behavior after exploding
我正在处理一个嵌套的 json 文件,其中包含我需要展开的多个级别的数组。
我注意到,在我分解一个数组后,我创建的列中的值发生了变化,该数组与我要存储在该列中的值处于同一级别。这是一个可视化的例子:
jsonDF = jsonDF.withColumn("values_level1", explode("data.values"))
.withColumn("name_level1", col("values_level1.name"))
到这里一切都很好,列“name_level1”包含我想在稍后阶段过滤的某些值。当我继续
时问题就开始了
.withColumn("values_level2", explode("values_level1.values"))
因为现在我在“name_level1”列中的值已经改变,我再也找不到我想稍后过滤的值。
这是我在概念上还没有理解的可以预料的事情吗(我对 Spark 还很陌生……)?我能以某种方式“保留”“name_level1”中的原始值吗?
非常感谢!
编辑:我正在添加一张可能有助于理解我的问题的图片:
为什么当我分解“值”时“名称”会改变?
我和一位同事谈过,他提供了一个有效的解决方案。使用
.withColumn("values_level2", explode_outer("values_level1.values"))
在“name_level1”
列中保留我需要的值
我正在处理一个嵌套的 json 文件,其中包含我需要展开的多个级别的数组。 我注意到,在我分解一个数组后,我创建的列中的值发生了变化,该数组与我要存储在该列中的值处于同一级别。这是一个可视化的例子:
jsonDF = jsonDF.withColumn("values_level1", explode("data.values"))
.withColumn("name_level1", col("values_level1.name"))
到这里一切都很好,列“name_level1”包含我想在稍后阶段过滤的某些值。当我继续
时问题就开始了.withColumn("values_level2", explode("values_level1.values"))
因为现在我在“name_level1”列中的值已经改变,我再也找不到我想稍后过滤的值。
这是我在概念上还没有理解的可以预料的事情吗(我对 Spark 还很陌生……)?我能以某种方式“保留”“name_level1”中的原始值吗?
非常感谢!
编辑:我正在添加一张可能有助于理解我的问题的图片:
为什么当我分解“值”时“名称”会改变?
我和一位同事谈过,他提供了一个有效的解决方案。使用
.withColumn("values_level2", explode_outer("values_level1.values"))
在“name_level1”
列中保留我需要的值