Apache Spark:将重复多行的DataFrame输出为单行JSON文件
解决Spark DataFrame生成单行JSON文件的问题
你的问题出在collect_metrics函数返回的是原DataFrame新增常量列后的结果,原DataFrame有多少行,输出的JSON就会有多少重复的行。要生成单行JSON,得从两个地方调整:
1. 生成单行统计结果的DataFrame
不用给原DataFrame的每一行都追加统计列,直接创建只包含统计值的单行DataFrame即可:
def collect_metrics(df) -> pyspark.sql.DataFrame: neg_value = df.where(df.count < 0).count() # 直接生成仅含统计结果的单行DataFrame return spark.createDataFrame([(neg_value,)], ["loader_neg_values"])
2. 配置JSON写入参数实现单行格式
Spark默认输出JSON Lines格式(每行一个JSON对象),要生成单行的JSON数组,需要开启multiLine选项,同时用coalesce(1)确保只生成一个文件:
def main(args): df_metrics = collect_metrics(df) df_metrics.coalesce(1) \ .write \ .option("multiLine", "true") \ .json(args.metrics)
关键说明
coalesce(1):将数据合并到单个分区,输出单个JSON文件(你的场景是单行数据,完全适用)option("multiLine", "true"):让Spark把整个DataFrame输出为单行的JSON数组,而非每行一个独立对象- Spark默认写入JSON时不做压缩,无需额外配置压缩相关参数
内容的提问来源于stack exchange,提问作者Mike3355
相关产品推荐
相关产品推荐

