如何从Spark结构化流更新ElasticSearch中的计数器?

时间:2018-08-29 06:48:15

标签: elasticsearch spark-structured-streaming

我正在研究Spark结构化流媒体项目,目标是向添加用户活动日志。

问题

  1. user_id在最近8个小时中首次显示时,请在ElasticSearch中创建一个新条目,并将文档中的counter设置为1;
  2. 如果最近8小时内同一用户有更多活动(日志),请更新counter字段,在其值中添加活动数量,最后更新update_time字段。

尽我所能设置"es.mapping.id" -> "user_id""es.write.operation" -> "upsert",但是更新时我无法更新计数器和时间。也许es.update.script.inline会有所帮助吗?

1 个答案:

答案 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字段的方式。