/ / Scala: Spark sql Zapytanie kontekstowe - sql, hadoop, apache-spark, apache-spark-sql, parkiet

Scala: Spark sqlContext query - sql, hadoop, apache-spark, apache-spark-sql, parquet

Mam tylko 3 zdarzenia (3. kolumna) 01, 02, 03 w moim pliku.

schemat to unixTimestamp | id | eventType | date1 | date2 | date3

639393604950|1001|01|2015-05-12 10:00:18|||
639393604950|1002|01|2015-05-12 10:04:18|||
639393604950|1003|01|2015-05-12 10:05:18|||
639393604950|1001|02||2015-05-12 10:40:18||
639393604950|1001|03|||2015-05-12 19:30:18|
639393604950|1002|02|2015-05-12 10:04:18|||

w sqlContext, jak scalić dane według identyfikatora? Spodziewam się tego dla identyfikatora 1001:

639393604950|1001|01|2015-05-12 10:00:18|2015-05-12 10:40:18|2015-05-12 19:30:18|

Oto moje zapytanie, które należy dostosować:

val events = sqlContext.sql("SELECT id, max(date1), max(date2), max(date3) " +
"FROM parquetFile group by id, date1, date2, date3")
events.collect().foreach(println)

Odpowiedzi:

2 dla odpowiedzi № 1
SELECT id, max(date1), max(date2), max(date3) FROM parquetFile group by id

0 dla odpowiedzi nr 2

Sposób, w jaki dane są generowane, wygląda na to, że schemat w pliku jest mylący. Problemem jest to, że wszystkie daty są wypełniane w polu date1, z różnymi typami zdarzeń. Dlatego musimy to naprawić.

select id, ts, max(d1),max(d2),max(d3)
from (select id, ts,
case when eventtype="01" then date1 else null end d1,
case when eventtype="02" then date1 else null end d2,
case when eventtype="03" then date1 else null end d3
from table1
) x group by id,ts

oczywiście grupuje to id i ts razem, zgodnie z oczekiwaniami w odpowiedzi.