繁体   English   中英

Scala Spark/Databricks:有效地加载具有不同架构的多个分区?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM