#python #pyspark #databricks #delta-lake
Вопрос:
Я совсем новичок в дельта-таблице Databricks и пытаюсь понять, как раздел будет работать с точки зрения производительности. Я понимаю, почему при разделении, но не совсем понимаю, как.
В качестве примера рассмотрим следующие (совершенно произвольные) данные
from pyspark.sql import *
import datetime
City = Row("Name", "CovidInfections", "Date")
city1 = City("Amsterdam", 312, datetime.date(2021, 9, 8))
city2 = City("Amsterdam", 289, datetime.date(2021, 9, 9))
city3 = City("London", 412, datetime.date(2021, 9, 8))
city4 = City("London", 403, datetime.date(2021, 9, 9))
city5 = City("Paris", 201, datetime.date(2021, 9, 8))
city6 = City("Paris", 188, datetime.date(2021, 9, 9))
city7 = City("Berlin", 48, datetime.date(2021, 9, 8))
city8 = City("Berlin", 112, datetime.date(2021, 9, 9))
# Create the dataframe
cities = spark.createDataFrame([city1, city2, city3, city4, city5, city6, city7, city8])
Я могу записать эти данные в дельта-таблицу, используя разделение по имени и дате:
cities.write.partitionBy("Name", "Date").format("delta").mode("overwrite").option("overwriteSchema", True).saveAsTable("covid_cities")
И я вижу, что в моем хранилище данных появляются отдельные папки как для имени, так и для даты. Однако, если бы я изменил данные только в одном из этих разделов, скажем
from pyspark.sql.functions import when
cities_updated = cities.withColumn("CovidInfections", when(cities["Name"]=="Berlin",230).otherwise(cities["CovidInfections"]))
и я бы сохранил эти обновленные данные
cities_updated.write.partitionBy("Name", "Date").format("delta").mode("overwrite").option("overwriteSchema", True).saveAsTable("covid_cities")
Я ожидал бы, что это повлияет только на наблюдения, связанные с Берлином. Однако в моем файловом хранилище я вижу, что для каждого города создается новая версия данных.
Кто-нибудь может пояснить, почему это происходит? Я на самом деле правильно разделяю? Или я должен сохранить свои данные каким-то другим способом?