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函式如下,紅色表示的部分為增...