Spark Streaming将TOPK多行数据以一行存储Redis
使用redis hset存储 的问题
话不多说直接看代码,一般的思路都是用hset 计算topk的 key就是名称,value就是数量,详细代码如下
Q1:spark streaming在算Top10值时,Spark Streaming没有排序算子,因此需要使用Transformer算子实现RDD与DStream的混合操作
Q2:计算的Top10中对于多行数据存储Redis并且需要每次计算后的Top10整体更新,如果使用Redis hash set,如果本次计算结果的key在过去一次中不存在,将无法覆盖,具体问题看下图。
那么可能会问,那我每次存储的时候清空HSET,HDEL只能删除一堆key value 那么你需要删除整个 HSET,再重新插入,会很麻烦
本人解决方法
那么对于部分key无法更新,并且Hset不断增大,因此将计算Top10转为Json字符串以String存储到Redis,可以实现每一次批次的Top10完整更新。如图展示了数据转换流程图及代码实现。
详细代码实现如下图,因为json序列化后用tostring转string,直接用一行字符串set保存进去,不需要hset,而且每次都是更新的整个字符串不存在更新不完以及累加的问题。
如果对spark streaming有应用,理解的有点深入,或许能明白我的意思。
结果查看
Redis数据查看
使用python json模块查看原数据,用java也可以
总结:可能也有更好的方式,但是这种我认为我的方法更粗暴
如果有错误的问题,也希望大家能指正