对数据文件进行分区

已完成

分区是一项优化技术,使 Spark 能够最大限度地提高工作器节点的性能。 在查询中筛选数据时,通过消除不必要的磁盘 IO 可以实现更高的性能提升。

对输出文件进行分区

要将数据帧另存为一组已分区的文件,可在写入数据时使用 partitionBy 方法。

以下示例创建派生的“年份”字段。 然后使用它对数据进行分区。

from pyspark.sql.functions import year, col

# Load source data
df = spark.read.csv('/orders/*.csv', header=True, inferSchema=True)

# Add Year column
dated_df = df.withColumn("Year", year(col("OrderDate")))

# Partition by year
dated_df.write.partitionBy("Year").mode("overwrite").parquet("/data")

对数据帧进行分区时生成的文件夹名称包括“column=value”格式的分区依据列名称和值,如下所示

Diagram representing a partitioned file folder structure.

注意

可按多个列对数据进行分区,这会为每个分区键生成一个文件夹层次结构。 例如,可按年份和月份对示例中的订单进行分区,这样在文件夹层次结构中,每个年份值都有一个文件夹,而在这些年份文件夹中,每个月份值都有一个子文件夹。

在查询中筛选 Parquet 文件

将 Parquet 文件中的数据读取到数据帧中时,可从分层文件夹中的任何文件夹拉取数据。 此筛选过程的完成方式是对已分区字段使用显式值和通配符。

在下面的示例中,以下代码将拉取 2020 年的销售订单。

orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))

注意

生成的数据帧会省略文件路径中指定的分区依据列。 该示例查询生成的结果不包括“年份”列 - 所有行都将来自 2020 年。