簡體   English   中英

如何將整行傳遞給UDF - Spark DataFrame過濾器

[英]How to pass whole Row to UDF - Spark DataFrame filter

我正在為具有大量內部結構的復雜JSON數據集編寫過濾函數。 傳遞單個列太麻煩了。

所以我聲明了以下UDF:

val records:DataFrame = = sqlContext.jsonFile("...")
def myFilterFunction(r:Row):Boolean=???
sqlc.udf.register("myFilter", (r:Row)=>myFilterFunction(r))

直覺我覺得它會像這樣工作:

records.filter("myFilter(*)=true")

實際的語法是什么?

在調用函數時,必須使用struct()函數構造行,請按照以下步驟操作。

導入行,

import org.apache.spark.sql._

定義UDF

def myFilterFunction(r:Row) = {r.get(0)==r.get(1)} 

注冊UDF

sqlContext.udf.register("myFilterFunction", myFilterFunction _)

創建dataFrame

val records = sqlContext.createDataFrame(Seq(("sachin", "sachin"), ("aggarwal", "aggarwal1"))).toDF("text", "text2")

使用UDF

records.filter(callUdf("myFilterFunction",struct($"text",$"text2"))).show

當你想要將所有列傳遞給UDF時。

records.filter(callUdf("myFilterFunction",struct(records.columns.map(records(_)) : _*))).show 

結果:

+------+------+
|  text| text2|
+------+------+
|sachin|sachin|
+------+------+
scala> inputDF
res40: org.apache.spark.sql.DataFrame = [email: string, first_name: string ... 3 more fields]

scala> inputDF.printSchema
root
 |-- email: string (nullable = true)
 |-- first_name: string (nullable = true)
 |-- gender: string (nullable = true)
 |-- id: long (nullable = true)
 |-- last_name: string (nullable = true)

現在,我想根據性別字段過濾行。 我可以通過使用.filter($"gender" === "Male")來實現這一點,但我想使用.filter(function)

所以,定義了我的匿名函數

val isMaleRow = (r:Row) => {r.getAs("gender") == "Male"}

val isFemaleRow = (r:Row) => { r.getAs("gender") == "Female" }

inputDF.filter(isMaleRow).show()

inputDF.filter(isFemaleRow).show()

我覺得可以以更好的方式完成需求,即不聲明為UDF並調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM