【问题标题】:Spark SQL Collect_list(struct) saved as jsonSpark SQL Collect_list(struct) 保存为 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]

【问题讨论】:

    标签: json apache-spark apache-spark-sql pyspark-sql pyspark-dataframes


    【解决方案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 不支持它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2021-09-29
      • 2020-09-15
      • 2018-07-31
      • 2017-03-17
      相关资源
      最近更新 更多