こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今回はDatabricksにおける、Spark DataFrameのユーザー定義関数(UDF)の作り方についてです。
Spark DataFrameのUDFを作るためには、以下の3点がポイントです。
・Scalaで関数を作成する
・DataFrameで使うSQL用のUDFを登録する
・DataFrameで使うScala用のUDFを登録する
試しに、URLエンコードされた文字列をデコードしてくれるdecodeUrl関数を作ります。
1. Scalaで元の関数を作成する
まずはScalaで関数そのものを書きます。
import java.net.URLDecoder def decodeUrl(x:String): String = { URLDecoder.decode(x, "UTF-8") }
ScalaはJavaのライブラリを使えるので便利ですね。
関数を宣言したら、動作確認をします。
decodeUrl("%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a")
実行すると、「あいうえお」というStringが返ってきます。
2. 関数をUDFとして登録して利用する
このdecodeUrl関数をUDFとして登録します。
val decodeUrlScalaUDF = spark.udf.register("decodeUrlSqlUDF", (x:String) => decodeUrl(x))
分かりやすくするためにUDFの名前を分けてます。
SQLで使うUDFとしてdecodeUrlSqlUDFを登録して、さらにScalaで使うUDFとして同時にdecodeUrlScalaUDFも登録します。
このUDFを使って、URエンコードされたカラムをデコードします。
display(adbDF.filter('page_url.contains("%")) .select('page_url, decodeUrlScalaUDF('page_url) as "decodedUrl") .limit(10))
Adobe AnalyticsのデータフィードでDataFrameを作成している前提です。
page_urlカラムには、エンコードされたURLが計測されているので、それをデコードしてます。
URLエンコードされているデータが、decodeUrlScalaUDFによってデコードされて表示されました。
3. UDFをSQLで実行する
SQLでもUDFを実行してみます。
createOrReplaceTempViewで先にテーブルを作っておいてから実行します。
%sql select page_url, decodeUrlSqlUDF(page_url) as decoded_url from adbDF where page_url like '%\%%' limit 10
実行するUDFはSQL用のdecodeUrlSqlUDFです。
SQLでもURLがデコードされました。
自作のUDFを使えば、ビルトインのメソッドだけでは実現出来ない複雑な処理を使ったクエリの作成が可能になります。
弊社はデジタルマーケティングからビッグデータ分析まで幅広くこなすデータ分析のプロ集団です。
Databricksのコンサルティング/導入支援についてのお問合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまでどうぞ。