2015-08-21 2 views
5

Я хотел бы сравнить два ряда подряд i с i-1 из col2 (отсортировано по col1).Как сравнить несколько строк?

Если item_i из i -й строки и item_[i-1]_row разные, хотелось бы увеличить значение счетчика на 1. item_[i-1]

+--------------+ 
| col1 col2 | 
+--------------+ 
| row_1 item_1 | 
| row_2 item_1 | 
| row_3 item_2 | 
| row_4 item_1 | 
| row_5 item_2 | 
| row_6 item_1 | 
+--------------+ 

В приведенном выше примере, если мы сканировать два ряда точке а время вниз, мы видим, что row_2 и row_3 отличаются друг от друга, поэтому мы добавляем один к item_1. Затем мы видим, что row_3 отличается от row_4, а затем добавляет один к item_2. Продолжить, пока мы не закончим:

+-------------+ 
| col2 col3 | 
+-------------+ 
| item_1 2 | 
| item_2 2 | 
+-------------+ 

ответ

8

Для этого вы можете использовать комбинацию оконной функции и агрегата. Функция окна используется для получения следующего значения col2 (с помощью col1 для заказа). Затем агрегат подсчитывает время, в течение которого мы сталкиваемся с различиями. Это осуществляется в следующем порядке:

val data = Seq(
    ("row_1", "item_1"), 
    ("row_2", "item_1"), 
    ("row_3", "item_2"), 
    ("row_4", "item_1"), 
    ("row_5", "item_2"), 
    ("row_6", "item_1")).toDF("col1", "col2") 

import org.apache.spark.sql.expressions.Window 
val q = data. 
    withColumn("col2_next", 
    coalesce(lead($"col2", 1) over Window.orderBy($"col1"), $"col2")). 
    groupBy($"col2"). 
    agg(sum($"col2" =!= $"col2_next" cast "int") as "col3") 

scala> q.show 
17/08/22 10:15:53 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation. 
+------+----+ 
| col2|col3| 
+------+----+ 
|item_1| 2| 
|item_2| 2| 
+------+----+ 
Смежные вопросы