Spark SQL 和 DataFrames

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  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值