scalaspark/databricks:有效地加载具有不同模式的多个分区?

daupos2t  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(299)

我的数据被划分为年/月/日。我希望能够加载任意的日期范围-开始日期和结束日期,而不仅仅是一个特定的日期/月/年。数据在不同的日期有轻微不同的模式。
我只能在一个级别加载一个项目,如“2020”、“2020年7月”或“2020年7月1日”。这很快,而且 mergeschema = true 任何架构问题都将为我处理。但是,我不能选择加载跨分区的特定星期或其他任意范围。
我可以在顶层加载 "mergeschema = true" ,将年/月/日字段转换为单个 date 列和该列上的筛选器。这可以实现任意范围,处理模式问题,但速度很慢,因为它查看所有数据时没有受益于分区。如果存在不能用mergeschema处理的模式问题,即使这些问题只存在于我正在加载的范围之外,它也会失败(例如,如果我试图在7月中旬加载一周的数据,但是在4月份有格式不正确的数据,那么如果我尝试加载然后过滤,它将失败。)
我可以通过编程找出与所讨论的日期范围相对应的分区集,加载它们并将它们合并在一起。这很快,只会查看需要加载的数据,但是如果存在模式差异,联合调用就会失败。
我即将自己编写一个“mergeschema”函数,这样我就可以合并不同的Dataframe,并在需要的地方添加空列(如果我加载了“mergeschema”,就会发生这种情况),但对于一个看似简单的问题来说,这是一个非常尴尬和困难的解决方案。
正确的处理方法是什么?我无法更改加载的源代码,它们是由离我很远的其他团队处理的。

axr492tv

axr492tv1#

使用括号或大括号:“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)

相关问题