使用HTTP POST,以下脚本可以插入新字段createtime
或更新lastupdatetime
:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"doc": {
"lastupdatetime": "2015-09-16T18:00:00"
}
"upsert" : {
"createtime": "2015-09-16T18:00:00"
"lastupdatetime": "2015-09-16T18:00",
}
}'
但是在火花脚本中,设置"es.write.operation": "upsert"
后,我根本不知道如何插入createtime
。 official document中只有es.update.script.*
...所以,有人能给我一个例子吗?
更新:在我的情况下,我想将Android设备的信息从日志保存到一个弹性搜索类型,并将其首次出现时间设置为{{1} }。如果设备再次显示,我只会更新createtime
,但保留lastupdatetime
原样。
所以文档createtime
是android ID,如果id存在,则更新id
,否则插入lastupdatetime
和createtime
。所以这里的设置是(在python中) :
lastupdatetime
如果conf = {
"es.resource.write": "stats-device/activation",
"es.nodes": "NODE1:9200",
"es.write.operation": "upsert",
"es.mapping.id": "id"
# ???
}
rdd.saveAsNewAPIHadoopFile(
path='-',
outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat",
keyClass="org.apache.hadoop.io.NullWritable",
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable",
conf=conf
)
不存在,我只是不知道如何插入新字段。
答案 0 :(得分:3)
如果没有看到您的Spark脚本,将很难给出详细的答案。但一般情况下,您需要使用elasticsearch-hadoop(因此您需要将该依赖项添加到Build.sbt文件中,例如),然后在您的脚本中,您可以:
import org.elasticsearch.spark._
val documents = sc.parallelize(Seq(Map(
"id" -> 1,
"createtime" -> "2015-09-16T18:00:00"
"lastupdatetime" -> "2015-09-16T18:00"),
Map(<next document>), ...)
.saveToEs("test/type1", Map("es.mapping.id" -> "id"))
根据official docs。 saveToES的第二个参数指定您的RDD中的哪个键用作ElasticSearch文档ID。
当然,如果您使用Spark执行此操作,则意味着您拥有的行数超出了您想要手动输入的行数,因此对于您的情况,您需要将数据转换为地图的RDD来自key - &gt;脚本中的值。但是在不知道数据源的情况下,我无法详细介绍。
答案 1 :(得分:0)
最后,我得到了一个不完美的解决方案:
createtime
添加到所有源文档; create
方法保存到es并忽略已创建的错误; createtime
字段; update
方法再次保存到es; 目前(2015-09-27),第2步可由this patch实施。