我使用Spark Streaming来处理在线需求,例如每小时的新用户数,如下所示:
按批次,当日志到来时,然后从外部表中选择uid,如hbase或dynamodb,如果不存在,则插入表
这种方法经常使用这个表,花费太多费用。
现在我想使用结构化流来解决这个问题。
在以下sql中可以解决离线问题:
create table event_min_table as select pageid,uid,floor(min(time)/36000)*3600 as event_time from event_table group by pageid,uid
select pageid,count(distinct uid) as cnt from event_min_table group by pageid,event_time
由于我不熟悉结构化流媒体,结构化流媒体不支持多重聚合,所以我这样使用:
readStream
创建一个sql1
的查询,然后在内存中注册为表格,输出模式为complete
从使用sql2
的表创建查询,输出格式为update
,保存到外部表,如hbase或dynamodb
我不知道我的方法是否可以解决问题,但我有几个问题:
如果我在complete
输出模式下创建一个内存表,数据会随着时间的推移而变大吗?
即使这可能有效,但结果是每个日志都输出,所以问题仍然无法解决,我的目标是减少对外部表的请求,例如hbase或dynamodb < / p>
答案 0 :(得分:0)
1)如果我将内存表创建为完整输出模式,数据会随着时间的推移而变大吗?
我不这么认为(见the code)。
我的目标是减少对外部表的请求
您可以使用KeyValueGroupedDataset.flatMapGroupsWithState运算符完全控制状态存储中的内容,时间和持续时间:
flatMapGroupsWithState 将给定函数应用于每组数据,同时保持用户定义的每组状态。结果数据集将表示函数返回的对象。对于静态批处理数据集,每个组将调用一次该函数。对于流数据集,将在每个触发器中重复调用每个组的函数,并且将在调用之间保存对每个组的状态的更新。
对于过去和当前数据集,您可以在结构化流中获得最多的控制权。