通过spark update 数据到arangodb

在使用spark写入arangoDB的包时,发现了一个问题,就是在写入数据到arangoDB时只能新增数据,当需要update数据时,直接使用包中的方法就不太方便。所以我尝试查看源码,新定义了一个方法,能够使spark在写入数据到arangoDB时能够update已经存在的数据。
使用的spark写入arangoDB的pom为:


    com.arangodb
    arangodb-spark-connector
    1.0.8

ArangoSpark默认save调用的方法为insertDocuments:

def saveRDD[T](rdd: RDD[T], collection: String, options: WriteOptions, map: Iterator[T] => Iterator[Any]): Unit = {
    val writeOptions = createWriteOptions(options, rdd.sparkContext.getConf)
    rdd.foreachPartition { p =>
      if (p.nonEmpty) {
        val arangoDB = createArangoBuilder(writeOptions).build()
        val col = arangoDB.db(writeOptions.database).collection(collection)
        col.insertDocuments(map(p).toList.asJava)
        arangoDB.shutdown()
      }
    }
  }

为了实现能够通过spark更新arangoDB数据,所以新增写入json RDD到arangoDB的代码如下:

implicit class RDD[T](rdd :org.apache.spark.rdd.RDD[T]){
    def saveJsonToArango(collection: String, options: WriteOptions) : Unit = {
      import scala.collection.JavaConverters.seqAsJavaListConverter
      import com.arangodb.model.DocumentImportOptions
      import com.arangodb.model.DocumentImportOptions.OnDuplicate
      val writeOptions = createWriteOptions(options, rdd.sparkContext.getConf)
      rdd.foreachPartition { p =>
        if (p.nonEmpty) {
          val arangoDB = createArangoBuilder(writeOptions).build()
          val col = arangoDB.db(writeOptions.database).collection(collection)
          val op = new DocumentImportOptions()
          op.onDuplicate(OnDuplicate.update)
          col.importDocuments(p.toList.asJava,op)
          arangoDB.shutdown()
        }
      }
    }
 }

主要是 将写入数据的方法换成了importDocuments,并且设置op.onDuplicate(OnDuplicate.update),可以使spark在写入数据到arangoDB时为update模式。

你可能感兴趣的:(大数据技术)