繁体   English   中英

如何在spark中融入elasticsearch?

[英]How to upsert into elasticsearch in spark?

使用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",
}
}'

但是在spark脚本中,在设置"es.write.operation": "upsert" ,我根本不知道如何插入createtime 官方文件中只有es.update.script.*所以,有人能给我举个例子吗?

更新 :在我的情况下,我想将日志中的Android设备信息保存为一个弹性搜索类型,并将其首次出现时间设置为创建createtime 如果设备再次出现,我只更新lastupdatetime ,但保留createtime原样。

所以文件id是android ID,如果id存在,则更新lastupdatetime ,否则插入createtimelastupdatetime 。所以这里的设置是(在python中):

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
)

如果id不存在,我只是不知道如何插入字段。

如果没有看到你的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"))

根据官方文件 saveToES的第二个参数指定您的RDD中的哪个键用作ElasticSearch文档ID。

当然,如果您使用Spark执行此操作,则意味着您拥有的行数超出了您想要手动输入的行数,因此对于您的情况,您需要将数据转换为来自键的RDD of Maps - >脚本中的值。 但是在不知道数据源的情况下,我无法详细介绍。

最后,我得到了一个不完美的解决方案:

  1. createtime添加到所有源doc;
  2. 使用create方法保存到es并忽略已创建的错误;
  3. 删除createtime字段;
  4. 使用update方法再次保存到es;

目前(2015-09-27), 此补丁可以实现第2步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM