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