🐷

SparkのLazy Evaluationの一端を見る

2022/04/30に公開

モチベーション

Sparkの主要機能の一つであるLazy Evaluationを簡単なコードでその一端を見る。
Lazy Evaluationは各サイトに説明があるので、省略する。

コード

sample1では、"sample1"のカラムを追加している。
sample2では、"sample2"のカラムを追加して、その後に"sample2"のカラムを追加している。
Lazy Evaluationの機能のない処理系では、sample2では、記述通りsample2のカラムを追加して、sample2のカラムを削除する処理を実行する。
しかし、explainを見てわかるとおり、Sparkの場合Lazy Evaluationにより最適化(Catalyst Optimizer)、sample2カラムの追加/削除の処理が取り除かれている。
処理実行時間もそれにおり、sample2の方が短くなっている。

サンプル 処理時間(s)
sample1 0.6
sample2 0.3
sample1
df = spark.read.csv(
    header=True, path="./data/Restaurants_in_Wake_County.csv", inferSchema=True
)

df = df.withColumn("sample1",F.lit("sample1"))

df.explain()
df.show()

Output exceeds the size limit. Open the full output data in a text editor
== Physical Plan ==
*(1) Project [OBJECTID#494881, HSISID#494882L, NAME#494883, ADDRESS1#494884, ADDRESS2#494885, CITY#494886, STATE#494887, POSTALCODE#494888, PHONENUMBER#494889, RESTAURANTOPENDATE#494890, FACILITYTYPE#494891, PERMITID#494892, X#494893, Y#494894, GEOCODESTATUS#494895, sample1 AS sample1#494911]
+- FileScan csv [OBJECTID#494881,HSISID#494882L,NAME#494883,ADDRESS1#494884,ADDRESS2#494885,CITY#494886,STATE#494887,POSTALCODE#494888,PHONENUMBER#494889,RESTAURANTOPENDATE#494890,FACILITYTYPE#494891,PERMITID#494892,X#494893,Y#494894,GEOCODESTATUS#494895] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex(1 paths)[file:/Users/tojoyuya/Desktop/delvelopments/pyspark-y/inaction/data/Res..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<OBJECTID:int,HSISID:bigint,NAME:string,ADDRESS1:string,ADDRESS2:string,CITY:string,STATE:s...

sample2
df2 = spark.read.csv(
    header=True, path="./data/Restaurants_in_Wake_County.csv", inferSchema=True
)

df2 = df2.withColumn("sample2",F.lit("sample2"))
df2 = df2.drop("sample2")

df2.explain()
df2.show()

Output exceeds the size limit. Open the full output data in a text editor
== Physical Plan ==
FileScan csv [OBJECTID#495024,HSISID#495025L,NAME#495026,ADDRESS1#495027,ADDRESS2#495028,CITY#495029,STATE#495030,POSTALCODE#495031,PHONENUMBER#495032,RESTAURANTOPENDATE#495033,FACILITYTYPE#495034,PERMITID#495035,X#495036,Y#495037,GEOCODESTATUS#495038] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex(1 paths)[file:/Users/tojoyuya/Desktop/delvelopments/pyspark-y/inaction/data/Res..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<OBJECTID:int,HSISID:bigint,NAME:string,ADDRESS1:string,ADDRESS2:string,CITY:string,STATE:s...

参考

  • Spark in Action chapter4

Discussion