在elasticsearch-hadoop的具體使用中碰到了幾個問題,有必要記錄一下,避免下次遇到時又要從新研究。node
import org.elasticsearch.spark.sql._ val esOptions = Map("es.nodes"->"192.168.1.2,192.168.1.3", "es.scroll.size"->"1000", "es.field.read.as.array.include"->"SampleField") val esDF = sqlContext.read.format("org.elasticsearch.spark.sql").options(esOptions).load("sampleindex/es-spark") esDF.registerTempTable("esdemotbl")
es.scroll.size 一次性讀入的記錄數,默認是10, 若是不設置爲大一點的值,要從es中讀取1億條數據,那將是一個漫長的過程sql
es.field.read.as.array.include 有的字段在es中是以string類型存儲,但其中包含逗號(,), spark默認認爲這是數組類型,若是讀取這種字段的話,就會報錯,怎麼辦,那就用es.field.read.as.array.include來顯式指明數組
spark讀取es中數據的時候,partition數目取決於es中指定index的shard數目,爲了得到比較高的併發讀取性能,建議適當設置shard數目,爲何是適當,由於具體取決於集羣規模等多種因素。併發
在hive中,字段名是_大小寫不敏感_的, 但在ES中是大小寫敏感的app
你說,這又怎麼樣。 呵呵, 這意味着不作特殊處理,永遠沒法讀出es中大寫字段名的內容,你看到的將是滿屏的_NULL_elasticsearch
這該怎麼破,很簡單,指定 es.mapping.namesoop
好比在es中,字段名爲DemoField, 要讀出其中的內容,hive表的字義就該這樣寫性能
create external table es_demo_tbl( demofield string) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.nodes'='192.168.1.2,192.168.1.3', 'es.resource'='demoindex/sample', 'es.mapping.names'='demofield:DemoField')
注意是先hive中的字段名,而後是es中的字段名spa