从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会给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章
Spark - 如何从 S3 读取具有文件名的多个 Json 文件
无法使用本地 PySpark 从 S3 读取 json 文件
从 S3 读取大型 JSON 文件 (3K+) 并从数组中选择特定键