Kendine bir masaya katılırken Spark'ın davranışını araştırıyorum. Veritabanları kullanıyorum.
Kukla senaryom:
Harici bir tabloyu veri çerçevesi A olarak okuyun (temel alınan dosyalar delta biçimindedir)
Veri çerçevesi B'yi yalnızca belirli sütunlar seçili olarak veri çerçevesi A olarak tanımlayın
Sütun1 ve sütun2'deki A ve B veri çerçevelerine katılın
(Evet, pek mantıklı değil, sadece Spark'ın temelindeki mekaniği anlamaya çalışıyorum)
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"])
İlk denemem kodu olduğu gibi çalıştırmaktı (deneme 1). Sonra yeniden bölümlemeye ve önbelleğe almaya çalıştım (deneme 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()
Sonunda, bölümlere ayırdım, sıraladım ve önbelleğe aldım
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()
Oluşturulan ilgili hatalar ektedir.
Sorularım:
Neden deneme 1'de önbellek açıkça belirtilmemiş olsa da tablo önbelleğe alınmış gibi görünüyor.
Neden InMemoreTableScan'ı her zaman bu tür başka bir düğüm izler.
Neden denemede 3 önbellekleme iki aşamada gerçekleşiyor?
Neden girişim 3 WholeStageCodegen bir (ve sadece bir) InMemoreTableScan izler.