簡體   English   中英

使用ES Hadoop連接器在Elastic Search中保存JavaRDD

[英]Saving the JavaRDD in Elastic Search using ES Hadoop connector

目前正在一個轉換項目中,我需要將數據提供給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-在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 ),在case類中將限制22個字段的限制。 請注意,您可以使用Map而不是case類

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>] 

對於上述所有方法,您可能希望將es.batch.write.retry.count傳遞給適當的值,或者如果您有另一種控制EMR生命周期的方式(確保它不會永遠運行),則應傳遞-1(無限重試)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM