如果我仅使用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
但是有什么方法可以在不使用数据框的情况下获得相同的结果吗?
答案 0 :(得分:5)
要评估文字列,您可以convert it到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
答案 1 :(得分:-1)
以下代码可以提供帮助:
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)