SparkSQL入门

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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值