Spark first, last函式的坑

2021-10-07 02:31:40 字數 1902 閱讀 1312

spark sql的聚合函式中有first, last函式,從字面意思就是根據分組獲取第一條和最後一條記錄的值,實際上,只在local模式下,你可以得到滿意的答案,但是在生產環境(分布式)時,這個是不能保證的。看原始碼的解釋:

/**

* returns the first value of `child` for a group of rows. if the first value of `child`

* is `null`, it returns `null` (respecting nulls). even if [[first]] is used on an already

* sorted column, if we do partial aggregation and final aggregation (when mergeexpression

* is used) its result will not be deterministic (unless the input table is sorted and has

* a single partition, and we use a single reducer to do the aggregation.).

*/

如何保證first, last是有效呢?表要排好序的,同時只能用乙個分割槽處理,再用乙個reducer來聚合。。。

所以,在多分割槽場景不能用first, last函式求得聚合的第一條和最後一條資料。

解決方案:利用window。

import spark.implicits._

val df = seq(("a", 10, 12345), ("a", 12, 34567), ("a", 11, 23456), ("b", 10, 55555), ("b", 8, 12348)).todf("name", "value", "event_time")

// 定義window

val asc = window.partitionby("name").orderby($"event_time")

val desc = window.partitionby("name").orderby($"event_time".desc)

// 根據window生成row_number,根據row_number獲取對應的資料

val firstvalue = df.withcolumn("rn", row_number().over(asc)).where($"rn" === 1).drop("rn")

val lastvalue = df.withcolumn("rn", row_number().over(desc)).where($"rn" === 1).drop("rn")

// 利用join把資料聚合一起

df.groupby("name")

.count().as("t1")

.join(firstvalue.as("fv"), "name")

.join(lastvalue.as("lv"), "name")

.select($"t1.name", $"fv.value".as("first_value"), $"lv.value".as("last_value"), $"t1.count")

.show()

輸出:

+----+-----------+----------+-----+

|name|first_value|last_value|count|

+----+-----------+----------+-----+

|   b|          8|        10|    2|

|   a|         10|        12|    3|

+----+-----------+----------+-----+

WaitForSingleObject函式的使用

程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...

cvCreateVideoWriter函式使用

cvcreatevideowriter函式使用 2011 11 04 15 47 例如,cv fourcc p i m 1 是mpeg 1 codec,cv fourcc m j p g 是motion jpeg codec cv fourcc m p 4 2 mpeg 4.2 codec cv f...

CentimetersToPoints函式出錯

在word開發中,碰到centimeterstopoints函式呼叫出錯,提示未指定的錯誤的問題。解決辦法為修改centimeterstopoint函式 匯入msword.olb後的centimeterstopoint函式如下 修改後的centimeterstopoint函式如下,紅色表示的部分為增...