结构化流处理多个查询?

时间:2017-09-08 07:52:56

标签: apache-spark spark-structured-streaming

我使用Spark Streaming来处理在线需求,例如每小时的新用户数,如下所示:

按批次,当日志到来时,然后从外部表中选择uid,如hbase或dynamodb,如果不存在,则插入表

这种方法经常使用这个表,花费太多费用。

现在我想使用结构化流来解决这个问题。

在以下sql中可以解决离线问题:

SQL1

create table event_min_table as select pageid,uid,floor(min(time)/36000)*3600 as event_time from event_table group by pageid,uid

SQL2

select pageid,count(distinct uid) as cnt from event_min_table group by pageid,event_time

由于我不熟悉结构化流媒体,结构化流媒体不支持多重聚合,所以我这样使用:

  1. readStream创建一个sql1的查询,然后在内存中注册为表格,输出模式为complete

  2. 从使用sql2的表创建查询,输出格式为update,保存到外部表,如hbase或dynamodb

  3. 我不知道我的方法是否可以解决问题,但我有几个问题:

    1. 如果我在complete输出模式下创建一个内存表,数据会随着时间的推移而变大吗?

    2. 即使这可能有效,但结果是每个日志都输出,所以问题仍然无法解决,我的目标是减少对外部表的请求,例如hbase或dynamodb < / p>

1 个答案:

答案 0 :(得分:0)

  

1)如果我将内存表创建为完整输出模式,数据会随着时间的推移而变大吗?

我不这么认为(见the code)。

  

我的目标是减少对外部表的请求

您可以使用KeyValueGroupedDataset.flatMapGroupsWithState运算符完全控制状态存储中的内容,时间和持续时间:

  

flatMapGroupsWithState 将给定函数应用于每组数据,同时保持用户定义的每组状态。结果数据集将表示函数返回的对象。对于静态批处理数据集,每个组将调用一次该函数。对于流数据集,将在每个触发器中重复调用每个组的函数,并且将在调用之间保存对每个组的状态的更新。

对于过去和当前数据集,您可以在结构化流中获得最多的控制权。