Pyspark Struct 列:爆炸后的奇怪行为

Posted

技术标签:

【中文标题】Pyspark Struct 列:爆炸后的奇怪行为【英文标题】:Pyspark Struct columns: weird behavior after exploding 【发布时间】:2021-12-19 00:00:31 【问题描述】:

我正在使用一个嵌套的 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”中的原始值吗?

提前非常感谢!

编辑:我正在添加一张可能有助于理解我的问题的图片:

为什么当我分解“值”时“名称”会改变?

【问题讨论】:

我想你要炸开'data'里的值.withColumn("values_level2", explode("data.values"))values_level1已经在第一步炸开 您好 Munesh,感谢您的回复。我确实在第一步中分解了“data.values”并将其称为“values_level1”。您在屏幕截图中看到的是“values_level1”列的结构。我想在不改变 values_level1.name 的情况下分解 values_level1.values 【参考方案1】:

我与一位同事交谈,他提供了一个行之有效的解决方案。使用

.withColumn("values_level2", explode_outer("values_level1.values"))

在“name_level1”列中保留我需要的值

【讨论】:

以上是关于Pyspark Struct 列:爆炸后的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

分组并爆炸pyspark数组类型列

如何在pyspark /中的结构内爆炸结构中的内部数组

使用 pyspark 将结构数组旋转到列中 - 不爆炸数组

如何通过在 PySpark 中选择 struct-array 列的一个字段来提取数组列

Pyspark - 将结构列合并到数组中

在GoLang中使用嵌套结构打印struct的奇怪行为