这里是大数据新手,虽然有多年的软件工程经验。
我在gzip压缩的JSON文件中有几个TB的数据,我想从中提取一些相关数据的子集,并在S3中存储为parquet文件,以供进一步分析和可能的转换。
这些文件的大小(压缩)各不相同,从几MB到几十GB不等。
出于生产目的,我计划在AWS Glue中使用PySpark进行ETL;出于探索的目的,我在Google Colab中玩了一下。
一开始我想把gzip压缩的JSON文件放到一个文件夹中,然后把它们读入Spark Dataframe ,然后执行我需要的任何转换。
df_test = spark.read.option("multiline", "true").json('/content/sample_data/test_files/*')
df_test.printSchema()
df_test = df_test.select(explode("in_scope").alias("in_scope"))
df_test.count()
令我惊讶的是,即使是一个相对较小的文件(16 MB压缩)也会导致近10 GB的内存占用(根据Colab笔记本中的RAM工具提示),这让我试图搜索答案和选项。然而,SO和Medium以及其他网站上的信息使事情变得更加混乱(可能是因为它们是在不同的时间点编写的)。
问题
1.对于这么小的文件,内存使用率高的原因可能是什么?
1.使用普通的Python甚至Linux脚本解压缩文件,然后使用PySpark处理解压缩的JSON文件,这样会更有效吗?
1.在Python中解压缩文件,并将in_scope
数组中所需的JSON对象重写为JSONL(换行符分隔的JSON)文件,然后使用PySpark处理解压缩的JSONL文件,这样会更高效吗?
1条答案
按热度按时间lg40wkob1#
1.解压缩的文件有多大?Gzip在压缩json和文本方面做得很好。当你加载gzip文件时,spark将解压缩并将结果保存在内存中
1.您的进程或spark必须付出解压缩文件的代价。不幸的是,在解压缩之前,您无法过滤相关数据,这导致我们:
1.最有效的方法是对输入数据进行分区,并在读取时进行过滤,如下所示:使用 predicate 过滤pyarrow.parquet.ParquetDataset中的行