对数据文件进行分区
分区是一项优化技术,使 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”格式的分区依据列名称和值,如下所示:
注意
可按多个列对数据进行分区,这会为每个分区键生成一个文件夹层次结构。 例如,可按年份和月份对示例中的订单进行分区,这样在文件夹层次结构中,每个年份值都有一个文件夹,而在这些年份文件夹中,每个月份值都有一个子文件夹。
在查询中筛选 Parquet 文件
将 Parquet 文件中的数据读取到数据帧中时,可从分层文件夹中的任何文件夹拉取数据。 此筛选过程的完成方式是对已分区字段使用显式值和通配符。
在下面的示例中,以下代码将拉取 2020 年的销售订单。
orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))
注意
生成的数据帧会省略文件路径中指定的分区依据列。 该示例查询生成的结果不包括“年份”列 - 所有行都将来自 2020 年。