Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 嵌套json和dataframe-从数组中检索数据_Apache Spark_Pyspark_Pyspark Sql_Pyspark Dataframes - Fatal编程技术网

Apache spark 嵌套json和dataframe-从数组中检索数据

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

我正在尝试从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.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...|
+--------------------+-----------+--------------------+
请注意,有些列的名称中包含一个点,请使用`来选择它们