Apache spark 嵌套json和dataframe-从数组中检索数据
我正在尝试从json文件中检索数据Apache spark 嵌套json和dataframe-从数组中检索数据,apache-spark,pyspark,pyspark-sql,pyspark-dataframes,Apache Spark,Pyspark,Pyspark Sql,Pyspark Dataframes,我正在尝试从json文件中检索数据 df=spark.read.json('/home/data/activities.json',multiLine=True) 内容如下所示(我只包括1行“数据”,共94行): 我对“数据”数组感兴趣,包括嵌套数组“标记”。我想跳过“meta.count”和“tags.myhelsinki:…” 我试过这个: df.withColumn("expl_data", explode_outer(col("tags"))).select("expl_data.da
df=spark.read.json('/home/data/activities.json',multiLine=True)
内容如下所示(我只包括1行“数据”,共94行):
我对“数据”数组感兴趣,包括嵌套数组“标记”。我想跳过“meta.count”和“tags.myhelsinki:…”
我试过这个:
df.withColumn("expl_data", explode_outer(col("tags"))).select("expl_data.data.name.en").show(10)
我收到了错误信息:
AnalysisException: "cannot resolve '`tags`' given input columns: [tags.myhelsinki:10, tags.myhelsinki:453, tags.myhelsinki:226, tags.myhelsinki:1016, tags.myhelsinki:342, tags.myhelsinki:531, tags.myhelsinki:364, tags.myhelsinki:836, tags.myhelsinki:346,...
当我尝试分解“tags.name”或“description.images”数组时,也会出现相同的错误。
有人能帮忙吗?我的目标是从这个结构中检索一组选定的字段(标记非常重要)
非常感谢!
Alicia您必须首先分解
数据
数组,以便访问嵌套字段:
df = df.select(explode_outer(col("data")).alias("data")).select(col("data.*"))
现在,您可以分解内部数组标记
和描述。图像
如下:
df = df.withColumn("tags", explode_outer(col("tags")))\
.withColumn("description.images", explode_outer(col("`description.images`")))
最后选择所需的列:
df.select("id", "tags.name", "`name.en`").show()
+--------------------+-----------+--------------------+
| id| name| name.en|
+--------------------+-----------+--------------------+
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
+--------------------+-----------+--------------------+
请注意,有些列的名称中包含一个点,请使用`来选择它们 必须首先分解
数据
数组,以便访问嵌套字段:
df = df.select(explode_outer(col("data")).alias("data")).select(col("data.*"))
现在,您可以分解内部数组标记
和描述。图像
如下:
df = df.withColumn("tags", explode_outer(col("tags")))\
.withColumn("description.images", explode_outer(col("`description.images`")))
最后选择所需的列:
df.select("id", "tags.name", "`name.en`").show()
+--------------------+-----------+--------------------+
| id| name| name.en|
+--------------------+-----------+--------------------+
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| sea|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...|suomenlinna|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
|f67de4f6-d23e-49a...| history|Cannon sloop Dian...|
+--------------------+-----------+--------------------+
请注意,有些列的名称中包含一个点,请使用`来选择它们