【问题标题】:Pyspark Struct columns: weird behavior after explodingPyspark Struct 列:爆炸后的奇怪行为
【发布时间】: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

标签: json apache-spark pyspark apache-spark-sql nested


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 2016-10-26
    • 2021-11-09
    • 1970-01-01
    • 2018-11-13
    • 2016-11-07
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多