Spark - передать полную строку в udf, а затем получить имя столбца внутри udf - PullRequest
0 голосов
/ 22 мая 2018

Я использую Spark со Scala и хочу передать всю строку в udf и выбрать для каждого имени столбца и значения столбца в стороне udf.Как я могу это сделать?

Я пытаюсь следовать -

inputDataDF.withColumn("errorField", mapCategory(ruleForNullValidation) (col(_*)))

def mapCategory(categories: Map[String, Boolean]) = {
  udf((input:Row) =>  //write a recursive function to check if each row is in categories if yes check for null if null then false, repeat this for all columns and then combine results)   
})

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вот простой рабочий пример:

Входные данные:

+-----+---+--------+
| NAME|AGE|CATEGORY|
+-----+---+--------+
|  RIO| 35|     FIN|
|  TOM| 90|     ACC|
|KEVIN| 32|        |
| STEF| 22|     OPS|
+-----+---+--------+

// Определение списка категорий и UDF

val categoryList = List("FIN","ACC")    
def mapCategoryUDF(ls: List[String]) = udf[Boolean,Row]((x: Row) => if (!ls.contains(x.getAs("CATEGORY"))) false else true)

import org.apache.spark.sql.functions.{struct}
df.withColumn("errorField",mapCategoryUDF(categoryList)(struct("*"))).show()

Результат должен выглядеть следующим образом:

+-----+---+--------+----------+
| NAME|AGE|CATEGORY|errorField|
+-----+---+--------+----------+
|  RIO| 35|     FIN|      true|
|  TOM| 90|     ACC|      true|
|KEVIN| 32|        |     false|
| STEF| 22|     OPS|     false|
+-----+---+--------+----------+

Надеюсь, это поможет !!

0 голосов
/ 22 мая 2018

В Spark 1.6 вы можете использовать Row в качестве внешнего типа и struct в качестве выражения.как выражение.Имя столбца можно получить из схемы.Например:

import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.{col, struct}

val df = Seq((1, 2, 3)).toDF("a", "b", "c")
val f = udf((row: Row) => row.schema.fieldNames)
df.select(f(struct(df.columns map col: _*))).show

// +-----------------------------------------------------------------------------+
// |UDF(named_struct(NamePlaceholder, a, NamePlaceholder, b, NamePlaceholder, c))|
// +-----------------------------------------------------------------------------+
// |                                                                    [a, b, c]|
// +-----------------------------------------------------------------------------+

Значения можно получить по имени, используя метод Row.getAs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...