我知道 df.count() 將觸發火花動作并回傳資料框中存在的記錄數,但我想知道這個程序在內部是如何作業的,火花會遍歷整個資料幀以計算記錄數還是有其他的優化技術,例如將值存盤在資料框的元資料中?
我正在使用 pyspark 3.2.1。
uj5u.com熱心網友回復:
似乎在后臺運行df.count()實際上使用了Count聚合類。我基于Dataset.scalacount中方法的定義。
/**
* Returns the number of rows in the Dataset.
* @group action
* @since 1.6.0
*/
def count(): Long = withAction("count", groupBy().count().queryExecution) { plan =>
plan.executeCollect().head.getLong(0)
}
是否有任何其他優化技術,例如將值存盤在資料幀的元資料中?
它將采用 Catalyst 使用的所有相同優化策略。它創建運算式的有向圖,評估并匯總它們。它沒有將計數值存盤為元資料,這將違反 Spark 的惰性求值原則。
我進行了一個實驗并驗證了這一點df.count()并df.groupBy().count()產生了相同的物理計劃。
df = spark.createDataFrame(pd.DataFrame({"a": [1,2,3], "b": ["a", "b", "c"]}))
# count using the Dataframe method
df.count()
# count using the Count aggregator
cnt_agg = df.groupBy().count()
這兩個作業產生了相同的物理計劃:
== Physical Plan ==
AdaptiveSparkPlan (9)
- == Final Plan ==
* HashAggregate (6)
- ShuffleQueryStage (5), Statistics(sizeInBytes=64.0 B, rowCount=4, isRuntime=true)
- Exchange (4)
- * HashAggregate (3)
- * Project (2)
- * Scan ExistingRDD (1)
- == Initial Plan ==
HashAggregate (8)
- Exchange (7)
- HashAggregate (3)
- Project (2)
- Scan ExistingRDD (1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/477857.html
