我正在以分布式模式运行spark,并且在窗口化方面遇到了一些麻烦。让我们看看我的数据框中的一种特定情况:
df.where($"client_id" === 221689).orderBy($"sequence_num".asc).show
+---------+------------+-----+
|client_id|sequence_num|state|
+---------+------------+-----+
| 221689| 6417377|REPBI|
| 221689| 6417378|DESBL|
| 221689| 6417379|REPOS|
| 221689| 920002|SUSUN|
| 221689| 920003|BLOQU|
| 221689| 920004|SUSBI|
| 221689| 920005| BAJA|
+---------+------------+-----+
很显然,订购工作不正常。当我应用窗口时,会应用相同的错误顺序:
val client_window = Window.partitionBy($"client_id").orderBy($"sequence_num").rowsBetween(Long.MinValue, Long.MaxValue)
df.withColumn("last_state", last($"state") over client_window).where($"client_id" === 221689).show
+---------+------------+-----+----------+
|client_id|sequence_num|state|last_state|
+---------+------------+-----+----------+
| 221689| 6417377|REPBI| BAJA|
| 221689| 6417378|DESBL| BAJA|
| 221689| 6417379|REPOS| BAJA|
| 221689| 920002|SUSUN| BAJA|
| 221689| 920003|BLOQU| BAJA|
| 221689| 920004|SUSBI| BAJA|
| 221689| 920005| BAJA| BAJA|
+---------+------------+-----+----------+
last_state
的值应为REPOS
,如最新序列号的状态一样,但是正在计算BAJA
,这是不正确的。
我正在HDP 2.6.1集群中使用Spark 1.6.3。