【发布时间】:2022-01-20 13:29:50
【问题描述】:
上下文
我有一个Parquet-table 存储在 HDFS 中,有两个分区,每个分区只产生一个文件。
parquet_table \
| year=2020 \
file_1.snappy.parquet
| year=2021 \
file_2.snappy.parquet
我的计划是只获取最新的分区并着手处理。
df = spark.read.parquet("hdfs_path_to_table/parquet_table/year=2021/")
这行得通,我只检索所需的数据。
当我为pySpark 写这篇文章时,我认为纯 Spark 会以某种方式模拟。
问题
尽管我检索到了正确的数据,但 Spark 仍然有两个分区连接到 DataFrame df:
df.rdd.getNumPartitions()
# -> 2
当我计算分区内的内容时,我发现只有一个产生数据:
df.rdd.mapPartitions(lambda partition: [len([row for row in partition])]).collect()
# -> [1450220, 0]
当然,我现在可以轻松地执行df.coalesce(1) 并最终得到想要的结果。
无论如何,我想知道为什么会发生这种情况,实际上我宁愿不想合并,而是直接只检索分区。
问题
有什么解决方案我的DataFrame df 将只有相应的正确.getNumPartitions() 吗?
因此,有没有办法加载单个 parquet-file 并在单个分区中生成该文件?
【问题讨论】:
-
您的文件大小是否大于
spark.sql.files.maxPartitionBytes? -
@mazaneicha:是的。明天看看有没有影响。无论如何,我对此表示怀疑,因为可以使用随机数量的分区复制上述示例(至少在我的情况下),并且空分区 + 完整分区将始终等于分区的总数。
-
顺便说一句:我检查了你的建议,但没有任何改变。
标签: python apache-spark pyspark parquet