目录
背景
开发过程中,根据项目的需求,需要实现使用Spark在ES中创建索引。
一、实现流程
数据流程如下
1 2 3 | graph LR A[Oracle]-->|数据上传|B[SparkSQL] B-->|创建索引|C[ES] |
二、实现细节
基本的操作
需要引用的头文件
1 2 3 4 5 | import org.apache.spark.rdd.RDD import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row} import org.apache.spark.{SparkConf, SparkContext} import org.elasticsearch.spark.sql.EsSparkSQL |
三、配置SparkContext
object SparkRdd{ //定义的类
def getSparkContext():SparkContext={
//进行Context配置
// org.elasticsearch.hadoop.cfg.ConfigurationOptions 这个类中记录了ES的配置信息
val conf = new SparkConf().setAppName("AppName").setMaster("local")
conf.set("es.index.auto.create", "true") //设置Index自动增长
.set("cluster.name","cet-es") //设置集群名称
.set("serverPort","9200") //设置服务端口
.set("es.nodes","192.168.3.151") //设置es节点名称
.set("es.nodes.wan.only","true") //设置使用域名访问
new SparkContext(conf) //根据以上的配置文件,创建SparkContext
}
def main(args: Array[String]): Unit = {
val sc = getSparkContext
//数据写到ES时,参数名称可以作为列名
case class Trip(departure: String, arrival: String) //创建类的时候,可以像创建变量一样
val upcomingTrip = Trip("OTP", "SFO")//创建类
val lastWeekTrip = Trip("MUC", "OTP")
val trip = sc.makeRDD(
Seq(upcomingTrip, lastWeekTrip)
)
//trip:是根据行程创建的RDD
//spark/docs:是指定数据需要存入ES中的{Index/Type}
//es.mapping.id:指明departure作为ES中数据的ID
EsSpark.saveToEs(trip,"spark/docs", Map("es.mapping.id" -> "departure"))
}
}