/ / Scala: Spark sqlKontextabfrage - sql, hadoop, apache-spark, apache-spark-sql, parkett

Scala: Spark sqlKontextabfrage - sql, hadoop, apache-spark, apache-spark-sql, parkett

Ich habe nur 3 Ereignisse (3. Spalte) 01, 02, 03 in meiner Datei.

Das Schema ist 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|||

Wie füge ich in sqlContext die Daten nach ID zusammen? Ich erwarte dies für die ID 1001:

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

Hier ist meine Abfrage, die angepasst werden muss:

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

Antworten:

2 für die Antwort № 1
SELECT id, max(date1), max(date2), max(date3) FROM parquetFile group by id

0 für die Antwort № 2

Die Art und Weise, wie Daten generiert werden, sieht aus, als ob das Schema in der Datei verwirrend ist. Das Problem ist, dass alle Daten im Feld Datum1 mit unterschiedlichen Ereignistypen ausgefüllt sind. Daher müssen wir es beheben.

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

Natürlich gruppiert dies ID und TS zusammen, wie in der Antwort erwartet.