elasticsearch,spark-streaming,spark-structured-streaming,Python,Scala,elasticsearch,Spark Streaming,Spark Structured Streaming" /> elasticsearch,spark-streaming,spark-structured-streaming,Python,Scala,elasticsearch,Spark Streaming,Spark Structured Streaming" />

Python 如何使用Spark在ElasticSearch中插入或部分更新脚本文档?

Python 如何使用Spark在ElasticSearch中插入或部分更新脚本文档?,python,scala,elasticsearch,spark-streaming,spark-structured-streaming,Python,Scala,elasticsearch,Spark Streaming,Spark Structured Streaming,我有一个python中的伪代码,它从Kafka流中读取,并在Elasticsearch中插入文档(如果文档已经存在,则递增计数器视图) for message in consumer: msg = json.loads(message.value) print(msg) index = INDEX_NAME es_id = msg["id"] script = {"script":"ctx._source.view+=1","upsert" : msg}

我有一个python中的伪代码,它从Kafka流中读取,并在Elasticsearch中插入文档(如果文档已经存在,则递增计数器
视图

for message in consumer:

    msg = json.loads(message.value)
    print(msg)
    index = INDEX_NAME
    es_id = msg["id"]
    script = {"script":"ctx._source.view+=1","upsert" : msg}
    es.update(index=index, doc_type="test", id=es_id, body=script)
因为我想在分布式环境中使用它,所以我使用Spark结构化流媒体

df.writeStream \
.format("org.elasticsearch.spark.sql")\
.queryName("ESquery")\
.option("es.resource","credentials/url") \
.option("checkpointLocation", "checkpoint").start()
或者在scala中使用SparkStreaming,从KafkaStream中读取:

// Initializing Spark Streaming Context and kafka stream
sparkConf.setMaster("local[2]")
val ssc = new StreamingContext(sparkConf, Seconds(10))
[...] 
val messages = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferConsistent,
      Subscribe[String, String](topicsSet, kafkaParams)
    )

[...]
val urls = messages.map(record => JsonParser.parse(record.value()).values.asInstanceOf[Map[String, Any]])
urls.saveToEs("credentials/credential")
.saveToEs(…)
elastic hadoop.jar
的API。不幸的是,它没有很好的文档记录。因此我不知道脚本命令可以放在哪里


有人可以帮助我吗?提前谢谢你

你应该可以通过设置写入模式“更新”(或upsert)并将脚本作为“脚本”(取决于ES版本)传递来完成

可能您想使用“upsert”

在同一个库中有一些好的设置;这些设置对于spark应该是好的,因为两者都使用相同的编写器


我建议阅读单元测试,为您的ES版本选择正确的设置。

您应该能够通过将写入模式设置为“更新”(或upsert)并将脚本传递为“脚本”(取决于ES版本)来完成此操作

可能您想使用“upsert”

在同一个库中有一些好的设置;这些设置对于spark应该是好的,因为两者都使用相同的编写器

我建议阅读单元测试,为您的ES版本选择正确的设置

EsSpark.saveToEs(rdd, "spark/docs", Map("es.mapping.id" -> "id", "es.write.operation" -> "update","es.update.script.inline" -> "your script" , ))