ฉันกำลังสำรวจพฤติกรรมของ Spark เมื่อเข้าร่วมโต๊ะกับตัวเอง ฉันกำลังใช้ Databricks
สถานการณ์จำลองของฉันคือ:
อ่านตารางภายนอกเป็น dataframe A (ไฟล์อ้างอิงอยู่ในรูปแบบของเดลต้า)
กำหนด dataframe B เป็น dataframe A โดยเลือกคอลัมน์บางคอลัมน์เท่านั้น
เข้าร่วม dataframes A และ B ในคอลัมน์ 1 และคอลัมน์ 2
(ใช่มันไม่สมเหตุสมผลมากนักฉันแค่ทดลองทำความเข้าใจกลไกพื้นฐานของ Spark)
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 หนึ่งเดียว (และเพียงอันเดียว)