SparkSQL 概述

ase on spark 1.5.1 overview

一、入口:

[java]  view plain  copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // this is used to implicitly convert an RDD to a DataFrame.  
  5. import sqlContext.implicits._  

SQLContext默认解析器为"sql",用于解析sql语句。

除了SQLContext之外,还有HiveContext,用了更加完善的解析器,默认解析器为spark.sql.dialect="hiveql"

二、创建DataFrames

目前支持从RDD、hive表以及其它数据源中创建DataFrames。详见下一篇介绍

[java]  view plain  copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. val df = sqlContext.read.json("examples/src/main/resources/people.json")  
  5.   
  6. // Displays the content of the DataFrame to stdout  
  7. df.show()  
三、DataFrames对外DSL接口

1、show:打印

2、printSchema:打印schema信息

3、select: 从原始DataFrames中选择部分colums

4、filter:过滤

5、groupBy:分组

6、count:计数

...

详见下一篇介绍

四、运行sql

[java]  view plain  copy
  1. val sqlContext = ...  // An existing SQLContext  
  2. val df = sqlContext.sql("SELECT * FROM table")  
五、Schema推断

1、从已知格式中反射出对应的schema信息,使用case classes

[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3. // this is used to implicitly convert an RDD to a DataFrame.  
  4. import sqlContext.implicits._  
  5.   
  6. // Define the schema using a case class.  
  7. // Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,  
  8. // you can use custom classes that implement the Product interface.  
  9. case class Person(name: String, age: Int)  
  10.   
  11. // Create an RDD of Person objects and register it as a table.  
  12. val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()  
  13. people.registerTempTable("people")  
  14.   
  15. // SQL statements can be run by using the sql methods provided by sqlContext.  
  16. val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")  
  17.   
  18. // The results of SQL queries are DataFrames and support all the normal RDD operations.  
  19. // The columns of a row in the result can be accessed by field index:  
  20. teenagers.map(t => "Name: " + t(0)).collect().foreach(println)  
  21.   
  22. // or by field name:  
  23. teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)  
  24.   
  25. // row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T]  
  26. teenagers.map(_.getValuesMap[Any](List("name""age"))).collect().foreach(println)  
  27. // Map("name" -> "Justin", "age" -> 19)  


2、不使用case classes
[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // Create an RDD  
  5. val people = sc.textFile("examples/src/main/resources/people.txt")  
  6.   
  7. // The schema is encoded in a string  
  8. val schemaString = "name age"  
  9.   
  10. // Import Row.  
  11. import org.apache.spark.sql.Row;  
  12.   
  13. // Import Spark SQL data types  
  14. import org.apache.spark.sql.types.{StructType,StructField,StringType};  
  15.   
  16. // Generate the schema based on the string of schema  
  17. val schema =  
  18.   StructType(  
  19.     schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))  
  20.   
  21. // Convert records of the RDD (people) to Rows.  
  22. val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))  
  23.   
  24. // Apply the schema to the RDD.  
  25. val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)  
  26.   
  27. // Register the DataFrames as a table.  
  28. peopleDataFrame.registerTempTable("people")  
  29.   
  30. // SQL statements can be run by using the sql methods provided by sqlContext.  
  31. val results = sqlContext.sql("SELECT name FROM people")  
  32.   
  33. // The results of SQL queries are DataFrames and support all the normal RDD operations.  
  34. // The columns of a row in the result can be accessed by field index or by field name.  
  35. results.map(t => "Name: " + t(0)).collect().foreach(println)  

六、数据源

1、从parquet格式的文件中加载/输出

[java]  view plain  copy
  1. val df = sqlContext.read.load("examples/src/main/resources/users.parquet")  
  2. df.select("name""favorite_color").write.save("namesAndFavColors.parquet")  
2、更方便的格式化,而无需像以上一样去解析

[java]  view plain  copy
  1. val df = sqlContext.read.format("json").load("examples/src/main/resources/people.json")  
  2. df.select("name""age").write.format("parquet").save("namesAndAges.parquet")  
3、Hive表

支持Hive的spark需要 -Phive 和 -Phive-thriftserver 编译spark,且需要将lib_managed/jars下的datanucleus相关jar包以及hive-site.xml 放在指定的位置。

详见spark 1.5.1 overview: http://spark.apache.org/docs/latest/sql-programming-guide.html

[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)  
  3.   
  4. sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")  
  5. sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")  
  6.   
  7. // Queries are expressed in HiveQL  
  8. sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)  

4、jdbc

需首先加载相应的jdbc驱动到spark classpath

每个工作节点上也需要能加载驱动包,可以将驱动jars放在每个节点的classpath中。

转载: http://blog.csdn.net/yueqian_zhu/article/details/49616563

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值