手动选择镶木地板分区与在 pyspark 中过滤它们

Posted

技术标签:

【中文标题】手动选择镶木地板分区与在 pyspark 中过滤它们【英文标题】:Hand selecting parquet partitions vs filtering them in pyspark 【发布时间】:2020-10-26 15:11:24 【问题描述】:

这可能是一个愚蠢的问题, 但是手动指定 parquet 文件中的分区列与加载它然后过滤它们有什么区别?

例如: 我有一个由DATE 分区的镶木地板文件。如果我想要最后 10 天,我通常可以执行以下操作:(假设今天是 2020-10-26)

df=spark.read.parquet("s3://bucket/path/file.parquet")\
.filter(col('DATE')>'2020-10-15')

或者我可以使用 S3 文件系统在 spark 数据帧中只加载所需的分区,如下所示:

inpath="s3://bucket/path/file.parquet/"
datepath=s3fs.S3FileSystem.ls(inpath)
dates=[]
for a in range(len(datepath)-10, len(datepath)):
    path="s3://" + datepath[a] + "/"
    dates=append(path)
df=spark.read.option("basePath", inpath).parquet(*dates)

在第二种方法中(在我的想法中)以复杂的方式执行此操作的原因是,我不必加载整个 parquet 文件以及内存中的所有日期然后过滤它们。 我想知道我的假设是否正确。

请指教。 谢谢你

【问题讨论】:

【参考方案1】:

两者都可以,但 Spark predicate push-down 已经存在了一段时间,让您的生活更轻松。例如。分区修剪和拼花统计数据的使用,例如最小/最大。请参阅 2017 年的 https://db-blog.web.cern.ch/blog/luca-canali/2017-06-diving-spark-and-parquet-workloads-example,它也适用于 pyspark。

并非所有的 van 都可以下推,但其他可以下推的运算符是“、>=,如 2017 年的链接所示。您可以使用.explain 来检查优化器如何应用或不应用谓词下推。

【讨论】:

因此,不仅可以通过对分区进行过滤来显着减少 I/O,而且只要数据类型有效且数据分布不均匀,还可以对未分区的列进行过滤。这在不使用method 2 的情况下为我节省了一堆代码。感谢您提供此信息!

以上是关于手动选择镶木地板分区与在 pyspark 中过滤它们的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 插入镶木地板文件时,Hive 表需要对每个新分区进行“修复”

在 PySpark 中为镶木地板文件过滤日期时间范围和时区

使用 pyspark 重新分区失败并出现错误

从多个分区读取多个镶木地板文件

带有 hive 的 pyspark - 无法正确创建分区并从数据框中保存表

无法将数据框保存到镶木地板 pyspark