【问题标题】:Scala: Spark sqlContext queryScala:Spark sqlContext 查询
【发布时间】:2015-08-02 13:27:12
【问题描述】:

我的文件中只有 3 个事件(第 3 列)01、02、03。

架构是 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|||

在sqlContext中,如何按ID合并数据?我期待这个 id 1001:

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

这是我需要调整的查询:

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

【问题讨论】:

  • 您的查询看起来不正确。另外,你只有 3 个偶数类型吗?
  • 是的,它没有产生我期望的结果。我只有 3 种事件类型。

标签: sql hadoop apache-spark apache-spark-sql parquet


【解决方案1】:
SELECT id, max(date1), max(date2), max(date3) FROM parquetFile group by id

【讨论】:

    【解决方案2】:

    数据的生成方式,看起来文件中的架构令人困惑。问题是所有日期都填充在 date1 字段中,具有不同的事件类型。因此,我们需要修复它。

    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
    

    当然,这将 id 和 ts 组合在一起,正如答案中所预期的那样。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 2016-07-28
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多