SparkSQL 相关API

一、SQLContext.scala中的接口说明

大部分接口都是创建DataFrame

1、构造:SQLContext的构造只需要一个SparkContext参数

2、设置/获取 配置:setConf/getConf

3、isCached/cacheTable/uncacheTable/clearCache:数据缓存相关,提高查询速度,需谨慎防止OOM

4、read:用于从外部数据源读取 //todo,下文有详细介绍

[java]  view plain  copy
  1. * Returns a [[DataFrameReader]] that can be used to read data in as a [[DataFrame]].  
  2.    * {{{  
  3.    *   sqlContext.read.parquet("/path/to/file.parquet")  
  4.    *   sqlContext.read.schema(schema).json("/path/to/file.json")  
  5.    * }}}  
  6. def read: DataFrameReader = new DataFrameReader(this)  

5、删除临时表

[java]  view plain  copy
  1. def dropTempTable(tableName: String): Unit  

6、查看目前有哪些表(表的产生在下文DataFrame的方法中有介绍)

[java]  view plain  copy
  1. def tableNames(): Array[String]  
  2. def tableNames(databaseName: String): Array[String]  
7、创建DataFrame:可通过现成的RDD或者Seq来创建
[java]  view plain  copy
  1. def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame  
  2. def createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame  
[java]  view plain  copy
  1. * Example:  
  2. * {{{  
  3. *  import org.apache.spark.sql._  
  4. *  import org.apache.spark.sql.types._  
  5. *  val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  6. *  
  7. *  val schema =  
  8. *    StructType(  
  9. *      StructField("name", StringType, false) ::  
  10. *      StructField("age", IntegerType, true) :: Nil)  
  11. *  
  12. *  val people =  
  13. *    sc.textFile("examples/src/main/resources/people.txt").map(  
  14. *      _.split(",")).map(p => Row(p(0), p(1).trim.toInt))  
  15. *  val dataFrame = sqlContext.createDataFrame(people, schema)  
  16. *  dataFrame.printSchema  
  17. *  // root  
  18. *  // |-- name: string (nullable = false)  
  19. *  // |-- age: integer (nullable = true)  
  20. *  
  21. *  dataFrame.registerTempTable("people")  
  22. *  sqlContext.sql("select name from people").collect.foreach(println)  
  23. * }}}  
  24. def createDataFrame(rowRDD: RDD[Row], schema: StructType): DataFrame  
 

8、创建DataFrame、外部表

[java]  view plain  copy
  1. def createExternalTable(tableName: String, path: String): DataFrame  
  2. def createExternalTable(  
  3.       tableName: String,  
  4.       path: String,  
  5.       source: String): DataFrame  
  6. def createExternalTable(  
  7.       tableName: String,  
  8.       source: String,  
  9.       options: Map[String, String]): DataFrame  
  10. def createExternalTable(  
  11.       tableName: String,  
  12.       source: String,  
  13.       schema: StructType,  
  14.       options: Map[String, String]): DataFrame  

9、创建DataFrame:创建一个只包含一个名为id的列,且在指定区间内的DataFrame

[java]  view plain  copy
  1. def range(start: Long, end: Long): DataFrame  
  2. def range(end: Long): DataFrame  
  3. def range(start: Long, end: Long, step: Long, numPartitions: Int): DataFrame  
10、创建DataFrame:从sql查询语句中创建DataFrame
[java]  view plain  copy
  1. def sql(sqlText: String): DataFrame  
11、创建DataFrame:从表创建DataFrame
[java]  view plain  copy
  1. def table(tableName: String): DataFrame  
  2. /** 
  3.    * Returns a [[DataFrame]] containing names of existing tables in the current database. 
  4.    * The returned DataFrame has two columns, tableName and isTemporary (a Boolean 
  5.    * indicating if a table is a temporary one or not). 
  6.    * 
  7.    * @group ddl_ops 
  8.    * @since 1.3.0 
  9.    */  
  10.   def tables(): DataFrame = {  
  11.     DataFrame(this, ShowTablesCommand(None))  
  12.   }  
  13. /** 
  14.    * Returns a [[DataFrame]] containing names of existing tables in the given database. 
  15.    * The returned DataFrame has two columns, tableName and isTemporary (a Boolean 
  16.    * indicating if a table is a temporary one or not). 
  17.    * 
  18.    * @group ddl_ops 
  19.    * @since 1.3.0 
  20.    */  
  21.   def tables(databaseName: String): DataFrame = {  
  22.     DataFrame(this, ShowTablesCommand(Some(databaseName)))  
  23.   }  

二、SQLContext中隐式转换

1、StringToColumn:将StringContext格式隐式转换成StringToColumn类对象,从而具有$方法将列名转成Column类型

[java]  view plain  copy
  1. /** 
  2.     * Converts $"col name" into an [[Column]]. 
  3.     * @since 1.3.0 
  4.     */  
  5.    implicit class StringToColumn(val sc: StringContext) {  
  6.      def $(args: Any*): ColumnName = {  
  7.        new ColumnName(sc.s(args : _*))  
  8.      }  
  9.    }  
2、scala Symbol类型的转换
[java]  view plain  copy
  1. /** 
  2.      * An implicit conversion that turns a Scala `Symbol` into a [[Column]]. 
  3.      * @since 1.3.0 
  4.      */  
  5.     implicit def symbolToColumn(s: Symbol): ColumnName = new ColumnName(s.name)  
3、将RDD或者Seq类型(元素类型为case classes/tuples)转换为DataFrameHolder,DataFrameHolder具有方法
[java]  view plain  copy
  1. /** 
  2.      * Creates a DataFrame from an RDD of case classes or tuples. 
  3.      * @since 1.3.0 
  4.      */  
  5.     implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder = {  
  6.       DataFrameHolder(self.createDataFrame(rdd))  
  7.     }  
  8.   
  9.     /** 
  10.      * Creates a DataFrame from a local Seq of Product. 
  11.      * @since 1.3.0 
  12.      */  
  13.     implicit def localSeqToDataFrameHolder[A <: Product : TypeTag](data: Seq[A]): DataFrameHolder =  
  14.     {  
  15.       DataFrameHolder(self.createDataFrame(data))  
  16.     }  
4、将RDD(元素类型为Int/Long/String)转换为DataFrameHolder
[java]  view plain  copy
  1. implicit def intRddToDataFrameHolder(data: RDD[Int]): DataFrameHolder  
  2. implicit def longRddToDataFrameHolder(data: RDD[Long]): DataFrameHolder  
  3. implicit def stringRddToDataFrameHolder(data: RDD[String]): DataFrameHolder  
5、DataFrameHolder具有如下方法名,用于最终转换成DataFrame
[java]  view plain  copy
  1. private[sql] case class DataFrameHolder(df: DataFrame) {  
  2.   
  3.   // This is declared with parentheses to prevent the Scala compiler from treating  
  4.   // `rdd.toDF("1")` as invoking this toDF and then apply on the returned DataFrame.  
  5.   def toDF(): DataFrame = df  
  6.   
  7.   def toDF(colNames: String*): DataFrame = df.toDF(colNames : _*)//给列自定义列名  
  8. }  

三、DataFrameReader

SQLContext类中的read方法返回一个DataFrameReader,它提供方法从外部获取DataFrame

1、格式化。通过format方法将数据源设置为source参数。默认数据源为parquet。

[java]  view plain  copy
  1. def format(source: String): DataFrameReader = {  
  2.     this.source = source  
  3.     this  
  4.   }  
2、定义schema信息
[java]  view plain  copy
  1. def schema(schema: StructType): DataFrameReader = {  
  2.     this.userSpecifiedSchema = Option(schema)  
  3.     this  
  4.   }  
3、附加参数
[java]  view plain  copy
  1. def option(key: String, value: String): DataFrameReader  
  2. def options(options: scala.collection.Map[String, String]): DataFrameReader  
4、load方法。正是加载从外部文件系统的路径下的文件
[java]  view plain  copy
  1. def load(path: String): DataFrame = {  
  2.     option("path", path).load()  
  3.   }  
  4. def load(): DataFrame  
5、jdbc

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

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

[java]  view plain  copy
  1. def jdbc(url: String, table: String, properties: Properties): DataFrame  
  2. def jdbc(  
  3.       url: String,  
  4.       table: String,  
  5.       columnName: String,  
  6.       lowerBound: Long,  
  7.       upperBound: Long,  
  8.       numPartitions: Int,  
  9.       connectionProperties: Properties): DataFrame  
  10. def jdbc(  
  11.       url: String,  
  12.       table: String,  
  13.       predicates: Array[String],  
  14.       connectionProperties: Properties): DataFrame  
6、json
[java]  view plain  copy
  1. def json(path: String): DataFrame = format("json").load(path)  
  2. def json(jsonRDD: RDD[String]): DataFrame  
7、parquet
[java]  view plain  copy
  1. def parquet(paths: String*): DataFrame  
8、从表加载创建DataFrame,同SQLContext中的同名方法
[java]  view plain  copy
  1. def table(tableName: String): DataFrame  
四、DataFrame

1、为schema注入列名,数量需一致

[java]  view plain  copy
  1. def toDF(colNames: String*): DataFrame  
2、获取schema信息
[java]  view plain  copy
  1. def schema: StructType   
3、获取列名及类型
[java]  view plain  copy
  1. /** 
  2.    * Returns all column names and their data types as an array. 
  3.    * @group basic 
  4.    * @since 1.3.0 
  5.    */  
  6.   def dtypes: Array[(String, String)] = schema.fields.map { field =>  
  7.     (field.name, field.dataType.toString)  
  8.   }  
4、获取列名
[java]  view plain  copy
  1. def columns: Array[String]  
5、打印schema信息
[java]  view plain  copy
  1. def printSchema(): Unit  
6、打印数据
[java]  view plain  copy
  1. def show(numRows: Int): Unit  
  2. def show(): Unit = show(20)  
7、join
[java]  view plain  copy
  1. def join(right: DataFrame): DataFrame  
  2. def join(right: DataFrame, usingColumn: String): DataFrame  
  3. def join(right: DataFrame, joinExprs: Column): DataFrame  
  4. def join(right: DataFrame, joinExprs: Column, joinType: String): DataFrame  
8、排序sort/orderBy
[java]  view plain  copy
  1. /** 
  2.    * Returns a new [[DataFrame]] sorted by the specified column, all in ascending order. 
  3.    * {{{ 
  4.    *   // The following 3 are equivalent 
  5.    *   df.sort("sortcol") 
  6.    *   df.sort($"sortcol") 
  7.    *   df.sort($"sortcol".asc) 
  8.    * }}} 
  9.    * @group dfops 
  10.    * @since 1.3.0 
  11.    */  
  12.   @scala.annotation.varargs  
  13. def sort(sortCol: String, sortCols: String*): DataFrame  
  14. def sort(sortExprs: Column*): DataFrame  
  15. def orderBy(sortCol: String, sortCols: String*): DataFrame = sort(sortCol, sortCols : _*)  
  16. def orderBy(sortExprs: Column*): DataFrame  
9、用小括号将列名转化为Column类型
[java]  view plain  copy
  1. def apply(colName: String): Column = col(colName)  
10、col方法将列名转化为Column类型,同apply
[java]  view plain  copy
  1. def col(colName: String): Column  
11、别名
[java]  view plain  copy
  1. def as(alias: String): DataFrame  
  2. def as(alias: Symbol): DataFrame  
12、选取部分列
[java]  view plain  copy
  1. def select(cols: Column*): DataFrame  
  2. def select(col: String, cols: String*): DataFrame  
13、选取部分列,比select灵活,参数可以是sql表达方式
[java]  view plain  copy
  1. /** 
  2.    * Selects a set of SQL expressions. This is a variant of `select` that accepts 
  3.    * SQL expressions. 
  4.    * 
  5.    * {{{ 
  6.    *   df.selectExpr("colA", "colB as newName", "abs(colC)") 
  7.    * }}} 
  8.    * @group dfops 
  9.    * @since 1.3.0 
  10.    */  
  11.   @scala.annotation.varargs  
  12.   def selectExpr(exprs: String*): DataFrame  
14、filter
[java]  view plain  copy
  1. /** 
  2.    * Filters rows using the given condition. 
  3.    * {{{ 
  4.    *   // The following are equivalent: 
  5.    *   peopleDf.filter($"age" > 15)//此处$"age"为Column类型,>符号被Column类重载,返回还是为Column类型 
  6.    *   peopleDf.where($"age" > 15) 
  7.    * }}} 
  8.    * @group dfops 
  9.    * @since 1.3.0 
  10.    */  
  11.   def filter(condition: Column): DataFrame  
  12. /** 
  13.    * Filters rows using the given SQL expression. 
  14.    * {{{ 
  15.    *   peopleDf.filter("age > 15")//参数为sql表达式 
  16.    * }}} 
  17.    * @group dfops 
  18.    * @since 1.3.0 
  19.    */  
  20.   def filter(conditionExpr: String): DataFrame  
15、where
[java]  view plain  copy
  1. /** 
  2.    * Filters rows using the given condition. This is an alias for `filter`. 
  3.    * {{{ 
  4.    *   // The following are equivalent: 
  5.    *   peopleDf.filter($"age" > 15) 
  6.    *   peopleDf.where($"age" > 15) 
  7.    * }}} 
  8.    * @group dfops 
  9.    * @since 1.3.0 
  10.    */  
  11.   def where(condition: Column): DataFrame  
16、groupBy
[java]  view plain  copy
  1. /** 
  2.    * Groups the [[DataFrame]] using the specified columns, so we can run aggregation on them. 
  3.    * See [[GroupedData]] for all the available aggregate functions. 
  4.    * 
  5.    * {{{ 
  6.    *   // Compute the average for all numeric columns grouped by department. 
  7.    *   df.groupBy($"department").avg() 
  8.    * 
  9.    *   // Compute the max age and average salary, grouped by department and gender. 
  10.    *   df.groupBy($"department", $"gender").agg(Map( 
  11.    *     "salary" -> "avg", 
  12.    *     "age" -> "max" 
  13.    *   )) 
  14.    * }}} 
  15.    * @group dfops 
  16.    * @since 1.3.0 
  17.    */  
  18.   @scala.annotation.varargs  
  19.   def groupBy(cols: Column*): GroupedData  

def groupBy(col1: String, cols: String*): GroupedData

17、获取前n行数据

[java]  view plain  copy
  1. def limit(n: Int): DataFrame  
18、unionAll
[java]  view plain  copy
  1. /** 
  2.    * Returns a new [[DataFrame]] containing union of rows in this frame and another frame. 
  3.    * This is equivalent to `UNION ALL` in SQL. 
  4.    * @group dfops 
  5.    * @since 1.3.0 
  6.    */  
  7.   def unionAll(other: DataFrame): DataFrame  
19、intersect
[java]  view plain  copy
  1. /** 
  2.   * Returns a new [[DataFrame]] containing rows only in both this frame and another frame. 
  3.   * This is equivalent to `INTERSECT` in SQL. 
  4.   * @group dfops 
  5.   * @since 1.3.0 
  6.   */  
  7.  def intersect(other: DataFrame): DataFrame  
20、前几行
[java]  view plain  copy
  1. def head(n: Int): Array[Row]  
  2. def head(): Row  
  3. override def first(): Row  
21、map 这里的rdd是RDD[Row],flatMap,mapPartitions,foreach,foreachPartition,take,collect,count,repartition,persist,cache同RDD方法
[java]  view plain  copy
  1. override def map[R: ClassTag](f: Row => R): RDD[R] = rdd.map(f)  
22、distinct

[java]  view plain  copy
  1. /** 
  2.    * Returns a new [[DataFrame]] that contains only the unique rows from this [[DataFrame]]. 
  3.    * This is an alias for `dropDuplicates`. 
  4.    * @group dfops 
  5.    * @since 1.3.0 
  6.    */  
  7.   override def distinct: DataFrame  
23、rdd
[java]  view plain  copy
  1. lazy val rdd: RDD[Row]  
24、将本DataFrame注册为临时表

[java]  view plain  copy
  1. /** 
  2.    * Registers this [[DataFrame]] as a temporary table using the given name.  The lifetime of this 
  3.    * temporary table is tied to the [[SQLContext]] that was used to create this DataFrame. 
  4.    * 
  5.    * @group basic 
  6.    * @since 1.3.0 
  7.    */  
  8.   def registerTempTable(tableName: String): Unit  
25、write,向外部输出,下面介绍
[java]  view plain  copy
  1. def write: DataFrameWriter  
26、转化为json
[java]  view plain  copy
  1. def toJSON: RDD[String]  
五、DataFrameWriter

1、设置保存模式

[java]  view plain  copy
  1. /** 
  2.    * Specifies the behavior when data or table already exists. Options include: 
  3.    *   - `SaveMode.Overwrite`: overwrite the existing data. 
  4.    *   - `SaveMode.Append`: append the data. 
  5.    *   - `SaveMode.Ignore`: ignore the operation (i.e. no-op). 
  6.    *   - `SaveMode.ErrorIfExists`: default option, throw an exception at runtime. 
  7.    * 
  8.    * @since 1.4.0 
  9.    */  
  10.   def mode(saveMode: SaveMode): DataFrameWriter = {  
  11.     this.mode = saveMode  
  12.     this  
  13.   }  
2、format
[java]  view plain  copy
  1. /** 
  2.    * Specifies the underlying output data source. Built-in options include "parquet", "json", etc. 
  3.    * 
  4.    * @since 1.4.0 
  5.    */  
  6.   def format(source: String): DataFrameWriter  
3、option
[java]  view plain  copy
  1. def option(key: String, value: String): DataFrameWriter  
[java]  view plain  copy
  1. def options(options: scala.collection.Map[String, String]): DataFrameWriter  
4、partitionBy
[java]  view plain  copy
  1. def partitionBy(colNames: String*): DataFrameWriter  
5、save
[java]  view plain  copy
  1. def save(path: String): Unit  
  2. def save(): Unit  

6、insertInto

[java]  view plain  copy
  1. def insertInto(tableName: String): Unit  

7、saveAsTable

[java]  view plain  copy
  1. def saveAsTable(tableName: String): Unit  

8、jdbc
[java]  view plain  copy
  1. def jdbc(url: String, table: String, connectionProperties: Properties): Unit  
9、json
[java]  view plain  copy
  1. def json(path: String): Unit = format("json").save(path)  
10、parquet,也是save是默认的,可以不预先设置parquet
[java]  view plain  copy
  1. def parquet(path: String): Unit = format("parquet").save(path)  


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值