如何用Python/PySpark/Pandas为单行JSON数组每条记录添加换行符
可以实现,以下分别提供Python原生、Pandas、PySpark三种技术栈的实现方案,其中PySpark方案最适配你后续导入Hive的需求。
方案1:Python原生实现(适合GB级以下小文件、单节点处理)
无需额外依赖,直接通过标准库解析JSON数组后逐行写入,可完整保留原始复杂JSON结构:
import json # 读取源单行JSON数组文件 with open("sample.json", "r", encoding="utf-8") as input_f: json_arr = json.load(input_f) # 输出为每行一条JSON记录的JSON Lines格式文件 with open("output.jsonl", "w", encoding="utf-8") as output_f: for record in json_arr: json.dump(record, output_f, ensure_ascii=False) output_f.write("\n")
方案2:Pandas实现
适合已经在使用Pandas做数据处理的场景:
import pandas as pd # 读取源JSON数组 df = pd.read_json("sample.json") # 导出为行分隔JSON格式 df.to_json("output.jsonl", orient="records", lines=True, force_ascii=False)
注意:如果JSON包含多层嵌套结构,Pandas会自动展开嵌套字段,若需要保留原始嵌套结构不修改,优先选择Python原生或PySpark方案。
方案3:PySpark实现(适合大文件/分布式场景,适配Hive导入需求)
该方案支持TB级大文件分布式处理,且可以跳过中间文件生成环节,直接将数据写入Hive表,是最适配你后续需求的方案:
from pyspark.sql import SparkSession # 初始化SparkSession,若运行在集群环境可按需调整配置 spark = SparkSession.builder.appName("JsonFormatConvert").enableHiveSupport().getOrCreate() # 读取源单行JSON数组文件 df = spark.read.option("multiline", "true").json("sample.json") # 可选:导出为行分隔JSON文件存储 df.write.option("lineSep", "\n").json("hdfs://your_hdfs_path/output_jsonl") # 可选:直接写入Hive表,无需中间文件 df.write.mode("append").saveAsTable("your_db.your_hive_table")
PySpark会自动识别JSON中的复合类型,对应Hive的STRUCT/ARRAY/MAP字段类型,无需手动做类型映射。
后续导入Hive注意事项
处理后的行分隔JSON(JSON Lines)是Hive解析JSON的标准格式,建表时使用JsonSerDe即可直接解析:
参考建表语句:
CREATE TABLE your_db.your_hive_table ( id INT, user_info STRUCT<username:STRING, age:INT, phone:STRING>, tags ARRAY<STRING>, ext MAP<STRING, STRING> ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE;数据导入语句:
LOAD DATA INPATH 'hdfs://your_hdfs_path/output_jsonl' INTO TABLE your_db.your_hive_table;
内容的提问来源于stack exchange,提问作者AnumNuma
相关产品推荐
相关产品推荐

