Spark:嵌套的 json 数据和重复的列名(pyspark)
Posted
技术标签:
【中文标题】Spark:嵌套的 json 数据和重复的列名(pyspark)【英文标题】:Spark: nested json data and duplicate column names (pyspark) 【发布时间】:2020-08-17 15:56:39 【问题描述】:我正在处理深度嵌套的json
data
。我的目标是扁平化数据。我知道在我想要的嵌套列称为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 [重复]