Spark SQLカスタム関数_第5章

1.カスタム関数の分類
ハイブのカスタム関数と同様に、sparkはカスタム関数を使用して新しい関数を実装することもできます。Spark
のカスタム関数は次のとおりです
。1. UDF(ユーザー定義関数)
入力1行、出力1行
2.UDAF(ユーザー定義集計関数)
入力複数行、出力1行
3.UDTF(ユーザー定義テーブル-関数の生成)
1行の入力、複数行の出力
2.カスタムUDF
要件
udf.txt データ形式は次のとおりです。

こんにちは
ABC
勉強

カスタムUDF関数を使用して、データの各行を大文字の
選択値、t_word
コードデモのsmallToBig(値)に変換します。

def main(args:Array [String]):Unit = {
// 1、create sparksession
val spark:SparkSession = SparkSession.builder()。master( "local [*]")。appName( "demo01")。getOrCreate( )
// 2、sparkcontext
val scを作成します:SparkContext = spark.sparkContext
// 3、データを読み取ります。そして、
val ttRDD:RDD [String] = sc.textFile(“ file:/// F:\ Chuanzhi Podcast \ Chuanzhi Professional College \ Second Semester \ 34 \ 05-Spark \ Data \ udf.txt”)
インポートを操作します。 spark.implicits._
val UDFDS:Dataset [String] = ttRDD.toDS()
//カスタム関数
spark.udf.register(“ toUpperAdd123”、(str:String)=> {
//ビジネスニーズに応じてデータを処理する
str.toUpperCase + "123"
})
UDFDS.createOrReplaceTempView( "UDF")
//関数
spark.sqlを呼び出します( "SELECT value、toUpperAdd123(value)as length_10 FROM UDF")。show()
sc.stop()
spark.stop()
}

3.カスタムUDAF [理解]
要件:
udaf.json データコンテンツは次のとおりです

{“ name”:“ Michael”、“ salary”:3000}
{“ name”:“ Andy”、“ salary”:4500}
{“ name”:“ Justin”、“ salary”:3500}
{“ name”: 「ベルタ」、「給与」:4000}

平均給与を取得するには

UserDefinedAggregateFunction メソッドを継承して、説明を書き換えます
inputSchema:入力データのタイプbufferSchema:中間結果
生成するデータタイプdataType:最終的に返される結果タイプを
決定的:一貫性を確保するために、通常はtrue
初期化を使用します:初期値を指定します
update:everyデータの一部は、中間結果を更新する操作に参加します(更新は各パーティションの操作と同等です)
マージ:グローバル集計(各パーティションの結果を集計)
評価:最終結果を計算し
ます●コードのデモ:

オブジェクトUdaf {
//平均給与を計算するメソッドを作成するSalaryAvg
クラスSalaryAvg extends UserDefinedAggregateFunction {
//入力データのタイプ
オーバーライドdef inputSchema:StructType = {
StructType(StructField(“ input”、LongType):: Nil)
}
//中間結果キャッシュ
オーバーライドのタイプdef bufferSchema:StructType = {
//キャッシュの合計量
// キャッシュの合計数
StructType(List(StructField(“ sum”、LongType)、(StructField(“ total”、LongType))))
}
//返されるデータのタイプ
override def
dataType :DataType = { DoubleType
}
//同じ出力がありますtrue
override def deterministic:Boolean = {
true
}
/ *
List(1,2,3,4,5).reduce((a、 b)=> a + b)
1 a = 1 b = 2
2 a = 3 b = 3
A = B = 6 3. 4。
4 A = B = 10 5。
5 = 51はAである。
/
//初期化データ
の上書きDEF初期化(緩衝液:MutableAggregationBuffer):単位= {
//の合計量記憶用
バッファ(0)= 0L /を/ => a
//ストレージ時間
バッファーの場合(1)= 0L // => b
}
// rddはパーティションです。このメソッドは、パーティション内のデータとデータ数を計算します
/

{“ name”:“ Michael” 、「給与」:3000}
{「名前」:「アンディ」、「給与」:4500}
{「名前」:「ジャスティン」、「給与」:3500}
{「名前」:「ベルタ」、「給与」: 4000}
/
def updateの上書き(バッファ:MutableAggregationBuffer、入力:行):Unit = {
//サブパーティション
バッファーの合計量を計算(0)= buffer.getLong(0)+ input.getLong(0)
//サブパーティションを計算
バッファーの総数(1)= buffer.getLong(1)+1
}
//すべてのパーティションの合計量と合計時間の要約
override def merge(buffer1:MutableAggregationBuffer、buffer2:Row):Unit = {
//すべてのパーティションの合計量
buffer1(0)= buffer1.getLong(0)+ buffer2.getLong(0)
//すべてのパーティションの合計回数
buffer1(1)= buffer1.getLong(1)+ buffer2.getLong(1)
}
//最終的な平均を見つける
//平均給与を計算する
//合計金額/合計数の
オーバーライドdef evaluate(buffer:Row):Any = {
buffer.getLong(0).toDouble / buffer.getLong(1).toDouble
}
}
def main(args:Array [String]):Unit = {
// 1、create sparksession
val spark:SparkSession = SparkSession.builder() master( "local [
]")。appName( "demo01")。getOrCreate()
val JsonDatas:DataFrame = spark.read.json( "file:/// F:\ Chuanzhi Podcast \ Chuanzhi Professional College \ Second学期\ 34 \ 05-Spark \ Information \ udaf.json”)
JsonDatas.createOrReplaceTempView( "UDAFTable")
//登録プロセス
UDAF 関数spark.udf.register( "SalaryAvg"、new SalaryAvg)
//平均給与を計算するためのアルゴリズム名はSalaryAvg
spark.sql( "select SalaryAvg(salary)from UDAFTable") ).show()
spark.sql(「select avg(salary)from UDAFTable」)show()
spark.stop()
}
}

元の記事を238件公開 賞賛された429件 ビュー250,000件

おすすめ

転載: blog.csdn.net/qq_45765882/article/details/105561548