Spark Dataframe升级到Elasticsearch

时间:2018-06-21 07:18:15

标签: scala apache-spark dataframe elasticsearch

我正在使用Apache Spark DataFrame,并且想将数据上载到Elasticsearch 我发现我可以这样覆盖他们

val df = spark.read.option("header","true").csv("/mnt/data/akc_breed_info.csv")

df.write
  .format("org.elasticsearch.spark.sql")
  .option("es.nodes.wan.only","true")
  .option("es.port","443")
  .option("es.net.ssl","true")
  .option("es.nodes", esURL)
  .option("es.mapping.id", index)
  .mode("Overwrite")
  .save("index/dogs")

但是到目前为止,我注意到的是该命令mode("Overwrite")实际上是删除所有现有的重复数据并插入新数据

有没有办法我可以upsert不删除它们并重新编写它们?因为我需要几乎实时查询这些数据。预先感谢

2 个答案:

答案 0 :(得分:1)

mode("Overwrite")出现问题的原因是,当您覆盖整个数据框时,它会立即删除与该数据框行匹配的所有数据,并且看起来整个索引对我来说都是空的,我知道如何实际upsert

这是我的代码

df.write
  .format("org.elasticsearch.spark.sql")
  .option("es.nodes.wan.only","true")
  .option("es.nodes.discovery", "false")
  .option("es.nodes.client.only", "false")
  .option("es.net.ssl","true")
  .option("es.mapping.id", index)
  .option("es.write.operation", "upsert")
  .option("es.nodes", esURL)
  .option("es.port", "443")
  .mode("append")
  .save(path)

请注意,您必须放入"es.write.operation", "upert".mode("append")

答案 1 :(得分:0)

尝试设置:

es.write.operation = upsert

这应该执行所需的操作。您可以在https://www.elastic.co/guide/en/elasticsearch/hadoop/current/configuration.html

中找到更多详细信息