[英]Scala Spark/Databricks: Efficiently load multiple partitions with different schema?
我有按年/月/日分区的数据。 我希望能够加载任意日期范围 - 开始日期和结束日期,而不仅仅是特定的日/月/年。 不同日期的数据具有略微不同的架构。
我只能在一个级别加载一个项目 - 例如“2020”、“2020 年 7 月”或“2020 年 7 月 1 日”。 这很快,并且使用mergeschema = true
任何架构问题都会为我处理。 但是,我不能选择加载跨分区的特定周或其他任意范围。
我可以使用"mergeschema = true"
在顶层加载,将年/月/日字段转换为单个date
列并在该列上进行过滤。 这可以做任意范围,处理模式问题但速度很慢,因为它查看所有数据而没有从分区中受益。 如果存在无法使用 mergeschema 处理的架构问题,即使这些问题仅存在于我加载的范围之外,它也会失败。 (例如,如果我尝试在 7 月中旬加载一周,但 4 月份存在格式错误的数据,如果我尝试加载然后过滤,它将失败。)
我可以以编程方式找出与相关日期范围对应的分区集,加载它们并将它们合并在一起。 这很快,并且只会查看它需要加载的数据,但是如果存在模式差异,联合调用就会失败。
我即将自己编写一个“MergeSchema”函数,以便我可以联合不同的数据帧并在需要的地方添加空列(如果我加载了“mergeschema”就会发生这种情况),但这感觉真的很尴尬看似简单的问题的困难解决方案。
处理这个问题的正确方法是什么? 我无法更改我正在加载的来源,它们由离我很远的其他团队处理。
使用方括号或大括号:“2020/07/[1-7]”或“2020/07/{1,2,3,4...}”
basePath='s3://some-bucket/year=2020/'
paths = [
's3://some-bucket/year=2020/month=06/day=2[6-9]',
's3://some-bucket/year=2020/month=06/day=30',
's3://some-bucket/year=2020/month=07/day=[1-3]',
]
df = spark.read.option("basePath", basePath).json(paths)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.