Файлы данных секционирования
Секционирование — это метод оптимизации, позволяющий spark повысить производительность на рабочих узлах. При фильтрации данных в запросах можно добиться большего повышения производительности, устраняя ненужные операции ввода-вывода на диск.
Секционирование выходного файла
Чтобы сохранить кадр данных в виде секционированного набора файлов, используйте метод partitionBy при записи данных.
В следующем примере создается производное поле Year . Затем используется для секционирования данных.
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))
Примечание.
Столбцы секционирования, указанные в пути к файлу, опущены в результирующем кадре данных. Результаты, полученные в примере запроса, не будут содержать столбец Year . Все строки будут составлять от 2020 года.