Я вивчаю поведінку Спарка під час приєднання таблиці до себе. Я використовую Databricks.
Мій фіктивний сценарій:
Читання зовнішньої таблиці як фрейму A (основні файли у форматі delta)
Визначте фрейм даних B як кадр даних A із вибраними лише певними стовпцями
З'єднайте фрейми даних A і B у колонці1 та колонці2
(Так, це не має великого сенсу, я просто експериментую, щоб зрозуміти основну механіку Спарка)
a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
b = a.select("column1", "column2", "columnA")
c= a.join(b, how="left", on = ["column1", "column2"])
Моєю першою спробою було запустити код таким, який він є (спроба 1). Потім я спробував переділити та кешувати (спроба 2)
a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).cache()
Нарешті я перерозподілив, сортував і кеширував
a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).sortWithinPartitions(col("column1"), col("column2")).cache()
Відповідні генеровані даги є такими, що додаються.
Мої запитання:
Чому в спробі 1 таблиця схоже на кешування, навіть якщо кешування не було чітко вказано.
Чому InMemoreTableScan завжди супроводжується іншим вузлом цього типу.
Чому в спробі 3 кешування відбувається на двох етапах?
Чому в спробі 3 WholeStageCodegen слідкує за одним (і єдиним) InMemoreTableScan.