elasticsearch,apache-spark,pyspark,Hadoop,elasticsearch,Apache Spark,Pyspark" /> elasticsearch,apache-spark,pyspark,Hadoop,elasticsearch,Apache Spark,Pyspark" />

Hadoop 如何在spark中插入elasticsearch?

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

使用HTTP POST,以下脚本可以插入新字段
createtime
或update
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",
}
}'
但是在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"))