Spark SQL 和 DataFrames
Spark SQL 是 Spark 内嵌的模块,用于结构化数据。在 Spark 程序中可以使用 SQL 查询语句或 DataFrame API。DataFrames 和 SQL 提供了通用的方式来连接多种数据源,支持 Hive、Avro、Parquet、ORC、JSON、和 JDBC,并且可以在多种数据源之间执行 join 操作。
Spark SQL之所以是除Spark core以外最大和最受关注的组件的原因:
a) 能处理一切存储介质和各种格式的数据(你同时可以方便的扩展Spark SQL的功能来支持更多的数据类型,例如KUDO)
b)Spark SQL 把数据仓库的计算能力推向了一个新的高度。不仅是无敌的计算速度(Spark SQL比Shark快了一个数量级,Shark比Hive快了一个数量级),尤其是在tungsten成熟以后会更加无可匹敌。更为重要的是把数据仓库的计算复杂度推向了历史新高度(Spark后续推出的Dataframe可以让数据仓库直接使用机器学习、图计算等算法库来对数据仓库进行深度数据价值的挖掘)。
c)Spark SQL(Dataframe,DataSet)不仅是数据仓库的引擎,同时也是数据挖掘的引擎,更为重要的是Spark SQL是科学计算和分析的引擎。
d)后来的DataFrame让Spark SQL一举成为大数据计算引擎的技术上的霸主(尤其是在钨丝计划的强力支持下)。
e) Hive+Spark SQL+DataFrame
1) Hive负责廉价的数据存储
2) Spark SQL 负责高速的计算
3)DataFrame 负责复杂的数据挖掘
- spark SQL是spark的一个模块,主要用于进行结构化数据的处理。它提供的最核心的编程抽象就是DataFrame。
- DataFrame:它可以根据很多源进行构建,包括:结构化的数据文件,hive中的表,外部的关系型数据库,以及RDD
创建DataFrame
数据文件students.json
- {"name":"Michael"}
- {"name":"Andy", "age":30}
- {"name":"Justin", "age":19}
- val df = sqlContext.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")
- // df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
- df.show() // 输出数据源内容
- // +----+-------+
- // | age| name|
- // +----+-------+
- // |null|Michael|
- // | 30| Andy|
- // | 19| Justin|
- // +----+-------+
接着,我们来演示 DataFrames 处理结构化数据的一些基本操作:
- df.select("name").show() // 只显示 "name" 列
- // +-------+
- // | name|
- // +-------+
- // |Michael|
- // | Andy|
- // | Justin|
- // +-------+
- df.select(df("name"), df("age") + 1).show() // 将 "age" 加 1
- // +-------+---------+
- // | name|(age + 1)|
- // +-------+---------+
- // |Michael| null|
- // | Andy| 31|
- // | Justin| 20|
- // +-------+---------+
- df.filter(df("age") > 21).show() # 条件语句
- // +---+----+
- // |age|name|
- // +---+----+
- // | 30|Andy|
- // +---+----+
- df.groupBy("age").count().show() // groupBy 操作
- // +----+-----+
- // | age|count|
- // +----+-----+
- // |null| 1|
- // | 19| 1|
- // | 30| 1|
- // +----+-----+
- //导入SQLContext
- scala> import org.apache.spark.sql.SQLContext
- import org.apache.spark.sql.SQLContext
- //声明一个SQLContext的对象,以便对数据进行操作
- scala> val sql = new SQLContext(sc)
- warning: there was one deprecation warning; re-run with -deprecation for details
- sql: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@27acd9a7
- //读取数据
- scala> val students = sql.read.json("file:///home/cxx/bigdata/people.json")
- students: org.apache.spark.sql.DataFrame = [age: bigint, id: bigint ... 1 more field]
- //显示数据
- students.registerTempTable("people") // 将 DataFrame 注册为临时表 people
- val result = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19") // 执行 SQL 查询
- result.show() // 输出结果
- // +------+---+
- // | name|age|
- // +------+---+
- // |Justin| 19|
- // +------+---+
DataFrame常用操作
- scala> students.show
- scala> students.printSchema
- scala> students.select("name").show
- scala> students.select(students("name"),students("age")+1).show
- scala> students.filter(students("age")>18).show
- scala> students.groupBy("age").count().show