Spark SQL Collect_list(struct) 保存为 json

Posted

技术标签:

【中文标题】Spark SQL Collect_list(struct) 保存为 json【英文标题】:Spark SQL Collect_list(struct) saved as json 【发布时间】:2019-09-17 19:02:23 【问题描述】:

我有一个需要生成为 json 文件的配置单元表。为了实现它,我申请了collect_list(struct(fields..))as A 并使用spark.write.json将其保存为json。

但是 json 在开头有一个额外的索引字段“A”,我不需要。我只需要 json 值的数组。我正在使用 pyspark

例如:

A:[array of jsons]
Expected: [array of json]

【问题讨论】:

【参考方案1】:

不要写成Json格式,而是尝试写成CSV格式。

您可以尝试将Array 类型转换为String,然后将数据写入HDFS 目录。

Example:

Scala:

val df=Seq((1,2,3),(3,4,5),(1,3,1)).toDF("i","j","k")

val df1=df.groupBy("i").agg(collect_set("j").alias("j")).selectExpr("cast(j as string)j")

df1.repartition(1).write.option("quote", "\u0000").mode("overwrite").csv("<hdfs_path>")

Output data:

[2, 3]
[4]

(或)

Pyspark:

df=spark.createDataFrame([(1,2,3),(3,4,5),(1,3,1)],["i","j","k"])

from pyspark.sql.functions import *

df1=df.groupBy("i").agg(collect_set("j").alias("j")).selectExpr("cast(j as string)j")

df1.repartition(1).write.option("quote", "").mode("overwrite").csv("<hdfs_path>")

Output data:

[2, 3]
[4]

【讨论】:

我试过了,它显示输出为 org.apache.spark.sql.catalyst.expressions.unsafearraydata【参考方案2】:

在将collect_list(struct) 生成为 json 之后。要删除索引A,我将其读入熊猫数据框并通过再次将其保存为 json 来删除索引 设置orient='records'

注意:collect_list of struct 仅适用于 spark SQL。 Hive 不支持它

【讨论】:

以上是关于Spark SQL Collect_list(struct) 保存为 json的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL Collect_list(struct) 保存为 json

Learning Spark [6] - Spark SQL高级函数

intellij 中 spark scala 应用程序中的线程“main”java.lang.NoClassDefFoundError:org/apache/spark/sql/catalyst/St

在 SQL (Hive) 中使用 collect_list 函数来聚合用户序列

列表上的 Spark 数据帧操作返回 [Ljava.lang.Object;@]

如何在 Spark SQL 中启用 Postgis 查询