spark2.4.3 sparkSQL 使用者自定義函式筆記
1、簡介
從Spark2.0以上的版本開始,spark是使用全新的SparkSession介面代替Spark1.6中的SQLcontext和HiveContext
來實現對資料的載入、轉換、處理等工作,並且實現了SQLcontext和HiveContext的所有功能。
我們在新版本中並不需要之前那麼繁瑣的建立很多物件,只需要建立一個SparkSession物件即可。
SparkSession支援從不同的資料來源載入資料,並把資料轉換成DataFrame,並支援把DataFrame轉換成SQLContext自身中的表。
然後使用SQL語句來運算元據,也提供了HiveQL以及其他依賴於Hive的功能支援。
建立SparkSession
SparkSession 是 Spark SQL 的入口。
使用 Dataset 或者 Datafram 編寫 Spark SQL 應用的時候,第一個要建立的物件就是 SparkSession。
Builder 是 SparkSession 的構造器。 通過 Builder, 可以新增各種配置。
Builder 的方法如下:
Method | Description |
---|---|
getOrCreate | 獲取或者新建一個 sparkSession |
enableHiveSupport | 增加支援 hive Support |
appName | 設定 application 的名字 |
config |
設定各種配置
|
2、sparkSQL基本使用方法
使用的spark版本2.4.3
spark 1.x中的SQLContext在新版本中已經被廢棄,改為SparkSession.builder
可以寫成
val conf = new SparkConf().setAppName("helloworld").setMaster("local[*]") val spark1=SparkSession.builder().config(conf).getOrCreate()
或(sparksession構造器私有化在builder中)
val spark = SparkSession.builder .appName("my spark application") .master("local[2]") .getOrCreate()
例:
import org.apache.spark.sql.SparkSession object HelloWorld { def main(args: Array[String]): Unit = { /* val conf = new SparkConf().setAppName("helloworld").setMaster("local[*]") val spark1=SparkSession.builder().config(conf).getOrCreate()*/ val spark = SparkSession.builder .appName("my spark application") .master("local[2]") .getOrCreate() //讀取資料 val df = spark.read.json("/usr/local/opt/spark-2.4.3/examples/src/main/resources/people.json") //展示所有資料 df.show() //DSL df.select("name").show() //SQL df.createTempView("people") spark.sql("select * from people where age=30").show() //關閉 spark.close() } }
輸出結果 1:
//展示所有資料 df.show()
輸出結果 2:
//DSL df.select("name").show()
輸出結果 3:
//SQL df.createTempView("people") spark.sql("select * from people where age=30").show()
3、通過udf自定義使用者函式addName (實現將欄位x前拼接上name:x)
scala> spark.read.json("./examples/src/main/resources/people.json") res32: org.apache.spark.sql.DataFrame = [age: bigint, name: string] scala> res32.createOrReplaceTempView("people") scala> spark.sql("select * from people") res38: org.apache.spark.sql.DataFrame = [age: bigint, name: string] scala> spark.sql("select * from people").show +----+-------+ | age| name| +----+-------+ |null|Michael| | 30| Andy| | 19| Justin| +----+-------+ scala> spark.udf.register("addName",(x:String)=> "name:"+x) res40: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,Some(List(StringType))) scala> spark.sql("select addName(name) as name from people").show +------------+ | name| +------------+ |name:Michael| | name:Andy| | name:Justin| +------------+
4、通過udaf自定義使用者函式
package com.ny.service import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Row, SparkSession} class CustomerAvg extends UserDefinedAggregateFunction { //輸入的型別 override def inputSchema: StructType = StructType(StructField("salary", LongType) :: Nil) //快取資料的型別 override def bufferSchema: StructType = { StructType(StructField("sum", LongType) :: StructField("count", LongType) :: Nil) } //返回值型別 override def dataType: DataType = LongType //冪等性 override def deterministic: Boolean = true //初始化 override def initialize(buffer: MutableAggregationBuffer): Unit = { buffer(0) = 0L buffer(1) = 0L } //更新 分割槽內操作 override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { buffer(0)=buffer.getLong(0) +input.getLong(0) buffer(1)=buffer.getLong(1)+1L } //合併 分割槽與分割槽之間操作 override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { buffer1(0)=buffer1.getLong(0)+buffer2.getLong(0) buffer1(1)=buffer1.getLong(1)+buffer2.getLong(1) } //最終執行的方法 override def evaluate(buffer: Row): Any = { buffer.getLong(0)/buffer.getLong(1) } } object CustomerAvg{ def main(args: Array[String]): Unit = { val spark= SparkSession.builder() .appName("MyAvg") .master("local[2]") .getOrCreate() spark.udf.register("MyAvg",new CustomerAvg) //讀資料 val frame = spark.read.json("/usr/local/opt/spark-2.4.3/examples/src/main/resources/peopleCP.json") frame.createTempView("peopleCP") spark.sql("select MyAvg(age) avg_age from peopleCP").show() spark.stop() } }
nancylulululu:resources nancy$ vi peopleCP.json {"name":"Michael","age":11} {"name":"Andy", "age":30} {"name":"Justin", "age":19}
返回結果
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908925/viewspace-2645049/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SparkSQL -- 02 【SparkSQL檔案的讀取與落地,和Hive的整合,內建函式,自定義函式】SparkSQLHive函式
- hive學習筆記之十:使用者自定義聚合函式(UDAF)Hive筆記函式
- Clickhouse 使用者自定義外部函式函式
- 【Spark篇】---SparkSQL中自定義UDF和UDAF,開窗函式的應用SparkSQL函式
- 教你認識AWK 使用者自定義函式函式
- Loadrunner 使用者自定義函式使用[轉]函式
- shell自定義函式函式
- Oracle 自定義函式Oracle函式
- perl自定義函式函式
- SparkSQL 開窗函式SparkSQL函式
- SparkSQL開窗函式SparkSQL函式
- Hive常用函式及自定義函式Hive函式
- hive 3.0.0自定義函式Hive函式
- Hive中自定義函式Hive函式
- MySQL建立自定義函式MySql函式
- python 自定義函式Python函式
- oracle 自定義聚合函式Oracle函式
- mysql自定義函式篇MySql函式
- Oracle中自定義函式Oracle函式
- 一個自定義函式函式
- Oracle自定義聚集函式Oracle函式
- ORACLE 自定義函式BUG?Oracle函式
- SQL SERVER 自定義函式SQLServer函式
- SQL 自定義函式FUNCTIONSQL函式Function
- SparkSql 06 開窗函式SparkSQL函式
- PHP 自定義函式用法及常用函式集合PHP函式
- java自定義equals函式和hashCode函式Java函式
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- laravel 自定義全域性函式Laravel函式
- Laravel 自定義函式存放位置Laravel函式
- Laravel 新增自定義助手函式Laravel函式
- Laravel自定義輔助函式Laravel函式
- GRDB自定義的純函式函式
- HIVE中的自定義函式Hive函式
- Sql Server系列:自定義函式SQLServer函式
- Oracle自定義聚集函式薦Oracle函式
- Teradata自定義函式Replace函式
- Linux Shell 自定義函式Linux函式