如何用PySpark读取无逗号分隔的多行JSON文件?
用PySpark处理无逗号分隔的多行JSON文件
普通Python加载大文件时因内存不足报错是常见问题,PySpark的分布式处理特性刚好适配这种场景,以下是针对无逗号分隔多行JSON的具体解决步骤:
1. 初始化SparkSession
这是PySpark所有操作的基础入口:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("ReadMultiLineJSON") \ .getOrCreate()
2. 读取目标JSON文件
无逗号分隔的多行JSON本质是每行一个独立JSON对象(即NDJSON格式),PySpark原生支持这种格式,只需指定对应参数:
multiLine=False:默认值,代表按行解析独立JSON对象,完美匹配你的文件格式inferSchema=True:让Spark自动推断字段类型,若你提前知晓数据结构,手动指定Schema能进一步提升效率
代码示例:
# 替换为你的文件路径(本地路径或分布式存储路径均可) df = spark.read.json("/path/to/your/14GB-file.json", multiLine=False, inferSchema=True) # 验证读取结果 df.printSchema() # 查看数据结构 df.show(5) # 展示前5行数据
如果你的文件是单个大JSON数组但元素间无逗号(这种情况较少见),则需设置multiLine=True,同时可能需要先通过RDD预处理修复格式,但绝大多数无逗号分隔的多行JSON场景用上面的方法即可直接解决。
3. 后续数据处理(可选)
读取完成后,可基于DataFrame进行任意操作,比如过滤、聚合、导出为更高效的格式:
# 示例:过滤数据并导出为Parquet格式(比JSON占用空间更小,读写更快) df.filter(df["target_column"] > 100).write.mode("overwrite").parquet("/path/to/output.parquet")
为什么PySpark不会内存溢出?
PySpark采用分块处理机制,不会将14GB文件一次性加载到内存,而是将文件拆分为多个小分区(默认每个分区约128MB),逐个分区处理,因此16GB内存完全能支撑整个流程。
内容的提问来源于stack exchange,提问作者Abdul Haseeb
相关产品推荐
相关产品推荐

