解析github上spark的例子
在spark的早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于sql,使用sqlContext。但是随着DataSet和DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。所以在spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点,SparkSession封装了SparkConf、SparkContext和SQLContext。为了向后兼容,SQLContext和HiveContext也被保存下来。
val spark = SparkSession
.builder()// 生成内部类Builder
.appName("SparkStatFormatJob")// 设置应用名
.master("local[2]")// 设置运行模式
//.config("spark.some.config.option", "some-value") github上的代码,不清楚作用,不影响使用
.getOrCreate()// 单例模式
加载并展示数据
val df = spark.read.json(path)
df.show()
import spark.implicits._
DataFrame中提供了详细的数据结构信息,从而使得SparkSQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么,DataFrame中的数据结构信息,即为schema。
df.printSchema()
选择name列并展示
df.select("name").show()
年龄加一并展示,多个列要加$符
df.select($"name", $"age" + 1).show()
选择年龄大于21岁的人的信息,filter(表达式)在scala中有定义,用于返回表达式为true的集合,这里是Dataset中的定义
df.filter($"age" > 21).show()
计算每个年龄有多少人,groupBy()对集合中的元素进行分组操作
df.groupBy("age").count().show()
将Dataframe注册为SQL临时视图
val sqlDF = spark.sql("SELECT * FROM people")
sqlDF.show()
将Dataframe注册为全局临时视图
df.createGlobalTempView("people")
spark.sql("SELECT * FROM global_temp.people").show()
全局临时视图是跨会话的
spark.newSession().sql("SELECT * FROM global_temp.people").show()
从文本文件中创建一个RDD对象,将其转换为Dataframe
val peopleDF = spark.sparkContext
.textFile(path)
.map(_.split(","))
.map(attributes => Person(attributes(0), attributes(1).trim.toInt))
.toDF()
将Dataframe注册为临时视图,查询年龄在13到19岁的,对每个元素处理
peopleDF.createOrReplaceTempView("people")
val teenagersDF = spark.sql("SELECT name, age FROM people WHERE age BETWEEN 13 AND 19")
teenagersDF.map(teenager => "Name: " + teenager(0)).show()
teenagersDF.map(teenager => "Name: " + teenager.getAs[String]("name")).show()
没有数据集的Dataset[MAP[K,V] ],明确定义
原始类型和case类也可以定义为
implicit val stringIntMapEncoder: Encoder[Map[String, Any]] = ExpressionEncoder()
implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Map[String, Any]]