我正在研究Spark结构化流媒体项目,目标是向添加用户活动日志。
问题:
user_id
在最近8个小时中首次显示时,请在ElasticSearch中创建一个新条目,并将文档中的counter
设置为1; counter
字段,在其值中添加活动数量,最后更新update_time
字段。尽我所能设置"es.mapping.id" -> "user_id"
和"es.write.operation" -> "upsert"
,但是更新时我无法更新计数器和时间。也许es.update.script.inline
会有所帮助吗?
答案 0 :(得分:1)
在阅读ES Scripted Updates document之后,这是一种使用轻松的内联脚本更新counter
的简单解决方案。
因此,关键是使用无痛脚本ctx._source.counter += params.counter
,该脚本counter
代表我的DataFrame列'counter
,应早些汇总。
毕竟,我最终会这样:
val esOptions = Map(
"es.write.operation" -> "upsert"
,"es.mapping.id" -> "user_id"
,"es.update.script.lang" -> "painless"
,"es.update.script.inline" -> "ctx._source.counter += params.counter"
,"es.update.script.params" -> "counter:counter"
df.writeStream.options(esOptions)
.format("org.elasticsearch.spark.sql")
.start("user_activity/log")
同样,这仅解决计数器更新。稍后,当我确定它时,将添加更新update_time
字段的方式。