Можно ли зарегистрировать строку как UDF? - PullRequest
0 голосов
/ 01 августа 2020

В Spark (Scala) после отправки jar-файла приложения в Spark, возможно ли для jar-файла извлечь много строк из таблицы базы данных, преобразовать каждую строку в выражение катализатора, а затем преобразовать это выражение в UDF , и использовать UDF для фильтрации строк в другом DataFrame и, наконец, объединить результат каждого UDF?

(для указанного выражения требуются некоторые или все столбцы DataFrame, но какие столбцы необходимы, пока неизвестно кода jar записывается, схема DataFrame известна во время разработки)

Пример:

выражение 1: "id == 1"

выражение 2: "name == \"andy\""

DataFrame:

  • строка 1: id = 1, name = "red", age = null
  • строка 2: id = 2, name = "andy", age = 20
  • строка 3: id = 3, name = "juliet", age = 21

конечным результатом должны быть первые две строки

Примечание: недопустимо сначала объединять два выражения с помощью or, поскольку мне нужно чтобы отследить, какое выражение приводит к строке результата

1 Ответ

2 голосов
/ 01 августа 2020

Отредактировано: Фильтр для каждого аргумента и объединение Все.

import org.apache.spark.sql.DataFrame

val df = spark.read.option("header","true").option("inferSchema","true").csv("test1.csv")

val args = Array("id == 1", "name == \"andy\"")
val filters = args.zipWithIndex

var dfs = Array[DataFrame]()

filters.foreach {
    case (filter, index) => 
        val tempDf = df.filter(filter).withColumn("index", lit(index))
        dfs = dfs :+ tempDf
}

val resultDF = dfs.reduce(_ unionAll _)
resultDF.show(false)

+---+----+----+-----+
|id |name|age |index|
+---+----+----+-----+
|1  |red |null|0    |
|2  |andy|20  |1    |
+---+----+----+-----+

Оригинал: Зачем просто вставлять строку в фильтр?

val df = spark.read.option("header","true").option("inferSchema","true").csv("test.csv")

val condition = "id == 1 or name == \"andy\""
df.filter(condition).show(false)

+---+----+----+
|id |name|age |
+---+----+----+
|1  |red |null|
|2  |andy|20  |
+---+----+----+

Я что-то пропустил?

...