Hadoop 如何在spark中插入elasticsearch?
使用HTTP POST,以下脚本可以插入新字段Hadoop 如何在spark中插入elasticsearch?,hadoop,elasticsearch,apache-spark,pyspark,Hadoop,elasticsearch,Apache Spark,Pyspark,使用HTTP POST,以下脚本可以插入新字段createtime或updatelastupdatetime: 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
createtime
或updatelastupdatetime
:
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",
}
}'
但是在spark脚本中,在设置了“es.write.operation:“upsert”
之后,我根本不知道如何插入createtime
。只有es.update.script.*
在。。。那么,谁能给我举个例子
更新:在我的例子中,我想将android设备的信息从log tooneelasticsearch类型保存,并将其首次出现时间设置为createtime
。如果设备再次出现,我只更新lastupdatetime
,但保持createtime
不变
因此文档id
是android,如果id存在,则更新lastupdatetime
,否则插入createtime
和lastupdatetime
。因此这里的设置是(在python中):
如果
id
不存在,我就不知道如何插入新的字段。如果没有看到您的Spark脚本,就很难给出详细的答案。但一般来说,您需要使用(例如,您需要将该依赖项添加到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"))
import org.elasticsearch.spark.\u
val文件=sc.parallelize(序列(地图(
“id”->1,
“createtime”->“2015-09-16T18:00:00”
“最新更新时间”->“2015-09-16T18:00”),
Map(),…)
.savetopes(“测试/类型1”,Map(“es.mapping.id”->“id”))
根据。saveToES的第二个参数指定要用作ElasticSearch文档id的映射RDD中的哪个键
当然,如果您使用Spark执行此操作,则意味着您的行数超过了手动键入的行数,因此对于您的情况,您需要将数据从脚本中的键->值转换为RDD映射。但是,在不知道数据源的情况下,我无法详细介绍更多信息。最后,我得到了一个不完美的解决方案:
createtime
添加到所有源文档中create
方法保存到es并忽略已创建的错误createtime
字段update
方法再次保存到es目前(2015-09-27),第2步可以通过如下方式实现。然后将es.write.operation设置为upsert,就像您所做的那样,然后使用rdd.saveToEs()应该做你想做的。不,
createtime
永远不应该更新。直接使用upsert
将覆盖此字段。我明白了。所以你想做一个部分文档upsert。例如,如果我可以问,409是什么?你能发布你得到的整个错误吗?似乎你把409与其他东西混淆了。因为Elasticsear默认情况下,ch更新已经存在的文档!请注意,首先我使用的是create
,而不是update
。如果Elasticsearch中已经存在id
,将引发异常,但不会更改文档。此处已创建异常。
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"))