首先说明,到目前为止,我使用过spark1.6写入数据到ES2.4中,使用很简单。
当我使用spark1.6写入到ES5.5的时候,一直不成功。
官网首先就讲了
through the dedicated support available since 2.1 or through the Map/Reduce bridge since 2.0. Spark 2.0 is supported in elasticsearch-hadoop since version 5.0.
在本地测试,发现使用spark2.x可以,就改scala版本为 2.11.8,将maven依赖换成spark2.1.0版本的,反正在本地测试,修改的东西并不多。
修改maven依赖,一定要注意版本的准确。
第一点改变的就是,这里的用法并不像之前的,使用rdd.saveToEs(。。。)就可以写入elasticsearch,在spark2.x中,会报错没有这个方法。
官方文档在这里: https://www.elastic.co/guide/en/elasticsearch/hadoop/master/spark.html
官方文档中有这个例子,并给出了步骤,这样操作可以成功写入,并且写入的两列,就是 departure, arrival
像上图这种,那么自定义的rdd,如何将内容写入ES,如下:
package com.bigsun
import org.apache.spark.sql.SparkSession
import org.elasticsearch.spark
import org.elasticsearch.spark.rdd.EsSpark
object App{
case class Trip(content: String)
def main(args: Array[String]): Unit = {
println( "Hello World!" )
System.setProperty("hadoop.home.dir", "G:\\hadoop_home")
val spark = SparkSession.builder()
.appName("SparkTest")
.master("local[5]")
.config("es.index.auto.create", "true")
.config("pushdown", "true")
.config("es.nodes", "192.168.2.5")
.config("es.port", "9200")
.config("es.nodes.wan.only", "true")
.getOrCreate()
//从ES中读取数据
val sparkDF = spark.sqlContext.read.format("org.elasticsearch.spark.sql").load("index/external")
sparkDF.take(10).foreach(println(_))
import spark.implicits._
val data = spark.read.textFile("g:\\mydata\\*")
//
写入到ES,一定要按照这个格式,因为这种格式才带有元数据信息,content就是ES中的列名
val rdd = data.rdd.map{
x => Trip(x)
}
EsSpark.saveToEs(rdd, "index/external")
spark.stop()
}
}
一定要将rdd转换成case class中的格式,按照我的理解,这里就是指定在ES中的列名。 最后将完整的春江花月夜写入到ES中。
spark1.x是否可以这样写入,还待测试。如果想知道答案,请联系我。
最后,网上关于es5.x 和 spark2.x资料真的不是很多。 碰到问题,首先查官网!这是这次的教训。
图显示不出来?就是ES的截图而已。