ApacheSpark--Java,组实时流数据

ApacheSpark--Java,组实时流数据,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我正在尝试使用Java从RabbitMQ到ApacheSpark获取实时JSON数据,并从中进行一些实时分析 我能够获取数据,并对其执行一些基本的SQL查询,但我无法理解分组部分 下面是我得到的JSON {“DeviceId”:“MAC-101”,“DeviceType”:“模拟器-1”,“数据”:{“时间戳”:“26-06-2017 16:43:41”,“FR”:10,“助理”:20,“模式”:1,“EMode”:2,“程序编号”:2,“状态”:3,“时间单位毫秒”:636340922213

我正在尝试使用Java从RabbitMQ到ApacheSpark获取实时JSON数据,并从中进行一些实时分析

我能够获取数据,并对其执行一些基本的SQL查询,但我无法理解分组部分

下面是我得到的JSON

{“DeviceId”:“MAC-101”,“DeviceType”:“模拟器-1”,“数据”:{“时间戳”:“26-06-2017 16:43:41”,“FR”:10,“助理”:20,“模式”:1,“EMode”:2,“程序编号”:2,“状态”:3,“时间单位毫秒”:636340922213668165}
{“设备ID”:“MAC-101”,“设备类型”:“模拟器-1”,“数据”:{“时间戳”:“26-06-2017 16:43:41”,“FR”:10,“ASSP”:20,“模式”:1,“EMode”:2,“程序编号”:2,“状态”:3,“时间毫秒”:636340922213668165}
{“设备ID”:“MAC-102”,“设备类型”:“模拟器-1”,“数据”:{“时间戳”:“26-06-2017 16:43:41”,“FR”:10,“ASSP”:20,“模式”:1,“EMode”:2,“程序编号”:2,“状态”:3,“时间毫秒”:636340922213668165}

{“DeviceId”:“MAC-102”,“DeviceType”:“Simulator-1”,“data”:{“TimeStamp”:“26-06-2017 16:43:41”,“FR”:10,“ASSP”:20,“Mode”:1,“EMode”:2,“ProgramNo”:2,“Status”:3,“TimeinMillisses”:636340922213668165}
这是因为在使用group by的查询中,在select中只能使用以下列:

  • 按分组列出的列
  • 任何列的聚合
如果使用“*”,则所有列都将在select中使用,这就是查询失败的原因。将查询更改为,例如:

select DeviceId, count(distinct DeviceType) as deviceTypeCount from DeviceData group by DeviceId

而且它会工作,因为它只使用group by中的列和聚合函数中的列

group by语句经常与聚合函数(COUNT、MAX、MIN、SUM、AVG)一起使用,以将结果集按一列或多列进行分组。

谢谢,我自己编写了大量sql,应该仔细考虑分组逻辑。正如您所建议的,如果您有一个与查询相关联的聚合,那么查询显然会通过。我已经用额外的细节编辑了我的问题,请让我知道你的想法。解决了这个问题,更新了主要帖子中的代码,以防有人看到同样的问题。