从s3读取json文件以使用glueContext.read.json粘合pyspark会给出错误的结果

Posted

技术标签:

【中文标题】从s3读取json文件以使用glueContext.read.json粘合pyspark会给出错误的结果【英文标题】:reading json files from s3 to glue pyspark with glueContext.read.json gives wrong result 【发布时间】:2020-01-03 20:28:44 【问题描述】:

有谁知道为什么glueContext.read.json 给我一个错误的结果? 基本上以下两种方法给了我非常不同的结果。爆炸后,df2 的记录比df1 少得多。 有人有过同样的经历吗? 谢谢!!

df1 = glueContext.create_dynamic_frame_from_options("s3", format="json", connection_options = "paths": ["s3://.../"])


df2 = glueContext.read.json("s3://.../",multiLine=True)

【问题讨论】:

【参考方案1】:

一般glueContext.create_dynamic_frame_from_options 用于从源位置(大文件)读取分组文件,因此默认情况下它会考虑文件的所有分区。下面是语法:

df = glueContext.create_dynamic_frame_from_options("s3", 'paths': ["s3://s3path/"], 'recurse':True, 'groupFiles': 'inPartition', 'groupSize': '1048576', format="json")

这里groupSize是可自定义的,您可以根据需要进行更改。

同时glueContext.read.json一般用于读取某个位置的特定文件。

因此,在您的情况下,glueContext.read.json 在读取时可能会丢失一些数据分区。这就是两个数据框的大小和行数不同的原因。

【讨论】:

谢谢。最初我选择使用glueContext.read.json 是因为它“似乎”工作,因为我有大量的桶/组要阅读。例如,如果我想读取此路径“s3://.../year=2019/month=11/day=06/”中的所有 json 文件,我该如何使用glueContext.create_dynamic_frame_from_options? 我不得不列出每个子桶,我觉得应该有更好的方法。例如:我必须这样做 - df0 = glueContext.create_dynamic_frame_from_options("s3", format="json", connection_options = "paths": [ "s3://.../journeys/year=2019/month= 11/天=06/小时=20/分钟=12/" ,"s3://.../journeys/year=2019/月=11/天=06/小时=20/分钟=13/" ," s3://.../journeys/year=2019/month=11/day=06/hour=20/minute=14/" ,"s3://.../journeys/year=2019/month=11 /day=06/hour=20/minute=15/" ,"s3://.../journeys/year=2019/month=11/day=06/hour=20/minute=16/" ... .]) 让我补充一点,如果我这样做,glueContext.create_dynamic_frame_from_options("s3", format="json", connection_options = "paths": [ "s3://.../year=2019/ month=11/day=06/" ]) ,它不会工作。

以上是关于从s3读取json文件以使用glueContext.read.json粘合pyspark会给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

AWS GlueContext 未初始化

Spark - 如何从 S3 读取具有文件名的多个 Json 文件

无法使用本地 PySpark 从 S3 读取 json 文件

从 S3 读取大型 JSON 文件 (3K+) 并从数组中选择特定键

Pyspark 从 S3 存储桶的子目录中读取所有 JSON 文件

通过火花数据框读取 S3 文件时,胶水书签不起作用