Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
手动选择拼花地板分区与在pyspark中过滤它们_Pyspark_Parquet_Hadoop Partitioning - Fatal编程技术网

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

手动选择拼花地板分区与在pyspark中过滤它们,pyspark,parquet,hadoop-partitioning,Pyspark,Parquet,Hadoop Partitioning,这可能是个愚蠢的问题, 但是在拼花地板文件中手动指定分区列与加载分区列然后过滤分区列之间有什么区别吗 例如: 我有一个拼花地板文件,它按DATE进行分区。如果我想要最后10天,我通常可以做以下事情:(假设今天是2020-10-26) 或者我可以使用S3文件系统在spark数据帧中只加载所需的分区,如下所示: inpath="s3://bucket/path/file.parquet/" datepath=s3fs.S3FileSystem.ls(inpath) dates=[

这可能是个愚蠢的问题, 但是在拼花地板文件中手动指定分区列与加载分区列然后过滤分区列之间有什么区别吗

例如: 我有一个拼花地板文件,它按
DATE
进行分区。如果我想要最后10天,我通常可以做以下事情:(假设今天是2020-10-26)

或者我可以使用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)
在第二种方法中(在我看来)采用精心设计的方法的原因是,我不必加载整个拼花地板文件,其中包含内存中的所有日期,然后过滤它们。 我想知道我的假设是否属实

请告知。
谢谢你

你两个都可以,但是Spark
谓词下推已经有一段时间了,让你的生活更轻松了。例如,分区修剪和使用拼花地板统计数据,如min/max。参见2017年,它也适用于pyspark


并不是所有的运营商都可以被下推,但2017年的链接显示,其他可以下推的运营商是“=”。您可以使用
.explain
检查优化器如何应用或不应用谓词下推。

因此,不仅可以通过对分区进行过滤来显著减少I/O,而且只要数据类型有效且数据分布不均匀,也可以对未分区的列进行过滤。这为我节省了一大堆代码,而无需使用
方法2
。谢谢你提供的信息!
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)