使用ES Hadoop连接器在Java弹出搜索中保存JavaRDD

时间:2017-05-11 20:10:03

标签: java hadoop apache-spark elasticsearch spark-dataframe

目前正致力于转型项目,我需要将数据提供给Oracle的弹性搜索。所以我的工作就像这样

1. Sqoop - From oracle
2. Java Spark - Dataframe Joins then saving them into elastic search repo's

我的弹性文档看起来像

{
Field 1: Value
Field 2: value
Field 3: Value
Field 4: [               -- Array of Maps
   {
    Name: Value
    Age: Value
   },{
    Name: Value
    Age: Value
   }
]
Field 5:{                -- Maps
   Code :Value
   Key : Value
}
}

所以想知道如何为上述结构形成一个javaRDD。

我已编码直到数据帧加入并卡住,无法从那里继续。 所以我希望我的数据采用标准化格式

我的火花代码

Dataframe esDF = df.select(
df.col("Field1") , df.col("Field2") ,df.col("Field3") 
 ,df.col("Name") ,df.col("Age") ,
  df.col("Code"),df.col("Key")
)

请帮忙。

1 个答案:

答案 0 :(得分:0)

几个选项:

1 - 在dataFrame本身中使用saveToES方法。 (旧版本可能不支持此功能,适用于elasticsearch-spark-20_2.11-5.1.1.jar

import org.apache.spark.sql.SQLContext._
import org.apache.spark.sql.functions._
import org.elasticsearch.spark.sql._

dataFrame.saveToEs("<index>/<type>",Map(("es.nodes" -> <ip:port>"))

2 - 创建案例类并使用RDD []方法进行保存。 (适用于旧版本)

import org.elasticsearch.spark._
case class ESDoc(...)
val rdd = df.map( row => EsDoc(..))
rdd.saveToEs("<index>/<type>",Map(("es.nodes" -> <ip:port>"))

3 - 对于旧版本的scala(< 2.11),在案例类中你将遇到22个字段限制。请注意,您可以使用Map而不是case class

import org.elasticsearch.spark._
val rdd  = df.map( row => Map(<key>:<value>...) )
rdd.saveToEs("<index>/<type>",Map(("es.nodes" -> <ip:port>")) // saves RDD[Map<K,V>] 

对于上述所有方法,如果您有另一种控制EMR生命周期的方法(确保它不会运行),您可能希望将es.batch.write.retry.count传递给适当的值,或者-1(无限次重试)曾经)

   val esOptions = Map("es.nodes" -> <host>:<port>, "es.batch.write.retry.count" -> "-1")