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 负责复杂的数据挖掘
[html]
view plain
copy
1. spark SQL是spark的一个模块,主要用于进行结构化数据的处理。它提供的最核心的编程抽象就是DataFrame。
2. DataFrame:它可以根据很多源进行构建,包括:结构化的数据文件,hive中的表,外部的关系型数据库,以及RDD
创建DataFrame
数据文件students.json
[javascript]
view plain
copy
1. {"name":"Michael"}
2. {"name":"Andy", "age":30}
3. {"name":"Justin", "age":19}
[html]
view plain
copy
1. val df = sqlContext.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")
2. // df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
3.
4. df.show() // 输出数据源内容
5. // +----+-------+
6. // | age| name|
7. // +----+-------+
8. // |null|Michael|
9. // | 30| Andy|
10. // | 19| Justin|
11. // +----+-------+
接着,我们来演示 DataFrames 处理结构化数据的一些基本操作:
[javascript]
view plain
copy
1. df.select("name").show() // 只显示 "name" 列
2. // +-------+
3. // | name|
4. // +-------+
5. // |Michael|
6. // | Andy|
7. // | Justin|
8. // +-------+
9.
10. df.select(df("name"), df("age") + 1).show() // 将 "age" 加 1
11. // +-------+---------+
12. // | name|(age + 1)|
13. // +-------+---------+
14. // |Michael| null|
15. // | Andy| 31|
16. // | Justin| 20|
17. // +-------+---------+
18.
19. df.filter(df("age") > 21).show() # 条件语句
20. // +---+----+
21. // |age|name|
22. // +---+----+
23. // | 30|Andy|
24. // +---+----+
25.
26. df.groupBy("age").count().show() // groupBy 操作
27. // +----+-----+
28. // | age|count|
29. // +----+-----+
30. // |null| 1|
31. // | 19| 1|
32. // | 30| 1|
33. // +----+-----+
当然,我们也可以使用 SQL 语句来进行操作:
[html]
view plain
copy
1. //导入SQLContext
2. scala> import org.apache.spark.sql.SQLContext
3. import org.apache.spark.sql.SQLContext
4. //声明一个SQLContext的对象,以便对数据进行操作
5. scala> val sql = new SQLContext(sc)
6. warning: there was one deprecation warning; re-run with -deprecation for details
7. sql: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@27acd9a7
8. //读取数据
9. scala> val students = sql.read.json("file:///home/cxx/bigdata/people.json")
10. students: org.apache.spark.sql.DataFrame = [age: bigint, id: bigint ... 1 more field]
11. //显示数据
12. students.registerTempTable("people") // 将 DataFrame 注册为临时表 people
13. val result = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19") // 执行 SQL 查询
14. result.show() // 输出结果
15. // +------+---+
16. // | name|age|
17. // +------+---+
18. // |Justin| 19|
19. // +------+---+
DataFrame常用操作
[html]
view plain
copy
1. scala> students.show
2. scala> students.printSchema
3. scala> students.select("name").show
4. scala> students.select(students("name"),students("age")+1).show
5. scala> students.filter(students("age")>18).show
6. scala> students.groupBy("age").count().show