Spark:嵌套的 json 数据和重复的列名(pyspark)

Posted

技术标签:

【中文标题】Spark:嵌套的 json 数据和重复的列名(pyspark)【英文标题】:Spark: nested json data and duplicate column names (pyspark) 【发布时间】:2020-08-17 15:56:39 【问题描述】:

我正在处理深度嵌套的jsondata。我的目标是扁平化数据。我知道在我想要的嵌套列称为attributes.id 的情况下,我可以使用以下符号来做到这一点,其中id 嵌套在attributes 列中:

df = df.select('attributes.id')

问题是df 中已经有一个名为id 的列,并且由于spark 只保留. 之后的最后一部分作为列名,所以我现在有重复的列名。处理这个问题的最佳方法是什么?理想情况下,新列将被称为 attributes_id 以区别于 id 列。

【问题讨论】:

【参考方案1】:

使用 .withColumn

重命名列

(或)

展平数据框,然后使用 .toDF() 重命名数据框中的列。

Example:

#sample json file data
"id":1,"attributes":"id":10

spark.read.json("<json_file_path>").printSchema()
#root
# |-- attributes: struct (nullable = true)
# |    |-- id: long (nullable = true)
# |-- id: long (nullable = true)

spark.read.json("<json_file_path>").\
withColumn("attributes_id",col("attributes.id")).\
drop("attributes").\
show()
#+---+-------------+
#| id|attributes_id|
#+---+-------------+
#|  1|           10|
#+---+-------------+

#or using toDF
columns=['id','attributes_id']

spark.read.json("<json_file_path>").\
select("id","attributes.*").\
toDF(*columns).\
show()
#+---+-------------+
#| id|attributes_id|
#+---+-------------+
#|  1|           10|
#+---+-------------+

如果您想动态展平,请使用this 链接答案。

【讨论】:

谢谢,哪一种被认为是最好的方法?还是没有真正的区别? 我认为使用.withColumn() 可以让您更好地控制要映射的列。 好的,谢谢。您知道如何提取名称中带有. 的嵌套字段吗?例如,我试图从数据中的attributes.categories 中提取字段Dr.Web,但由于Dr.Web 中的.,它会感到困惑并认为Dr 是json 中的一个级别。我收到以下错误:AnalysisException: No such struct field Dr in Dr.Web 我们需要转义它..参考这个链接如何转义.***.com/questions/63341060/… 知道如何为 pyspark 执行此操作,链接是针对 scala 的吗?【参考方案2】:

选择后可以.alias("attributes_id")

【讨论】:

以上是关于Spark:嵌套的 json 数据和重复的列名(pyspark)的主要内容,如果未能解决你的问题,请参考以下文章

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

使用 spark 更改 bigquery 中嵌套数据的列名

如何将spark数据帧列名和行数据转换为json数据

Spark高级操作之json复杂和嵌套数据结构的操作一

如何使用 Apache Spark 和 Scala 创建嵌套 json

使用 spark 读取和访问 json 文件中的嵌套字段