Как выполнить выражение столбца в искре без фрейма - PullRequest
0 голосов
/ 06 июля 2018

Можно ли как-нибудь оценить выражение Column, если я использую только Literal (без столбцов данных).

Например, что-то вроде:

val result: Int = someFunction(lit(3) * lit(5))
//result: Int = 15

или

import org.apache.spark.sql.function.sha1
val result: String = someFunction(sha1(lit("5")))
//result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4

Я могу оценить, используя фреймы данных

val result = Seq(1).toDF.select(sha1(lit("5"))).as[String].first
//result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4

Но есть ли способ получить те же результаты без использования фрейма?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Следующий код может помочь:

val isUuid = udf((uuid: String) => uuid.matches("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"))


df.withColumn("myCol_is_uuid",isUuid(col("myCol")))
.filter("myCol_is_uuid = true")
.show(10, false)
0 голосов
/ 06 июля 2018

Чтобы оценить буквальный столбец, вы можете преобразовать его в Expression и eval без предоставления input строки:

scala> sha1(lit("1").cast("binary")).expr.eval()
res1: Any = 356a192b7913b04c54574d18c28d46e6395428ab

Пока функция UserDefinedFunction, она будет работать одинаково:

scala> val f = udf((x: Int) => x)
f: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))

scala> f(lit(3) * lit(5)).expr.eval()
res3: Any = 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...