apache-spark - Spark查找日期分区列的最大值
问题描述
我有一个按以下方式划分的镶木地板:
data
/batch_date=2020-01-20
/batch_date=2020-01-21
/batch_date=2020-01-22
/batch_date=2020-01-23
/batch_date=2020-01-24
这里作为分区列的 batch_date 是日期类型。
我只想从最新的日期分区中读取数据,但作为消费者,我不知道最新的值是多少。
我可以通过类似的方式使用一个简单的组
df.groupby().agg(max(col('batch_date'))).first()
虽然这会起作用,但这是一种非常低效的方式,因为它涉及 groupby。
我想知道我们是否可以以更有效的方式查询最新的分区。
谢谢。
解决方案
执行@pasha701 建议的方法将涉及使用所有 batch_date 分区加载整个 spark 数据帧,然后找到其中的最大值。我认为作者正在寻求一种直接查找最大分区日期并仅加载该日期的方法。一种方法是使用 hdfs 或 s3fs,并将 s3 路径的内容作为列表加载,然后找到最大分区,然后仅加载该分区。那会更有效率。
假设您使用的是 AWS s3 格式,如下所示:
import sys
import s3fs
datelist=[]
inpath="s3:bucket_path/data/"
fs = s3fs.S3FileSystem(anon=False)
Dirs = fs.ls(inpath)
for paths in Dirs:
date=paths.split('=')[1]
datelist.append(date)
maxpart=max(datelist)
df=spark.read.parquet("s3://bucket_path/data/batch_date=" + maxpart)
这将完成列表中的所有工作,而无需将任何内容加载到内存中,直到找到您要加载的内容。
推荐阅读
- python - 如何更改此函数以使其返回文件中偶数位数的列表?
- user-interface - 一旦 ui.alert 被注释掉,模态对话框无法在提交时关闭
- java - 简单链表:在代码中获取“错误 - 发现循环”
- swift - 如何以编程方式确定时间(小时/分钟)并将它们设置为 Swift 中的 00/00?
- node.js - Node.js | ColorThief.getColor() 返回无法追踪的错误
- python - Ruby 的 to_s(2) 是如何翻译成 python 的?
- flutter - 我可以更改有状态小部件的语言环境吗?
- numpy-ndarray - (R,)和(R,S,T)之间的区别?
- python - 如何在python中实现稀疏矩阵的幂迭代法
- javascript - JavaScript:有没有办法检测这种格式的给定日期在过去 X 天内?