apache-spark - 如何强制 Spark SQL 进入代码生成模式?
问题描述
我正在Expression
使用自定义 codegen 编写自定义 Spark 催化剂,但 Spark (3.0.0) 似乎不想使用生成的代码,并退回到解释模式。
我以非常标准的方式创建我的 SparkSession,除了我尝试强制代码生成:
val spark = SparkSession.builder()
.appName("test-spark")
.master("local[5]")
.config("spark.sql.codegen.factoryMode", "CODEGEN_ONLY")
.config("spark.sql.codegen.fallback", "false")
.getOrCreate()
然后我定义Expression
了解释模式和代码生成的这个自定义:
case class IsTrimmedExpr(child: Expression) extends UnaryExpression with ExpectsInputTypes {
override def inputTypes: Seq[DataType] = Seq(StringType)
override lazy val dataType: DataType = BooleanType
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
throw new RuntimeException("expected code gen")
nullSafeCodeGen(ctx, ev, input => s"($input.trim().equals($input))")
}
override protected def nullSafeEval(input: Any): Any = {
throw new RuntimeException("should not eval")
val str = input.asInstanceOf[org.apache.spark.unsafe.types.UTF8String]
str.trim.equals(str)
}
}
我将其注册到会话的注册表中:
spark.sessionState.functionRegistry.registerFunction(
FunctionIdentifier("is_trimmed"), {
case Seq(s) => IsTrimmedExpr(s)
}
)
要调用函数/表达式,我会
val df = Seq(" abc", "def", "56 ", " 123 ", "what is a trim").toDF("word")
df.selectExpr("word", "is_trimmed(word)").show()
但是doGenCode
,我没有从函数中得到预期的异常,而是从函数中得到了nullSafeEval
根本不应该运行的异常。
如何强制 Spark 使用 codegen 模式?
解决方案
通过将 spark.sql.codegen 设置为 True 来启用 codegen
推荐阅读
- python - TypeError:“浮动”对象不支持项目分配
- css - 如何删除一个css类?
- react-native - 这个错误是什么以及在 React Native App 中使用 Expo.TypeError 有什么问题
- marshalling - BeanIO 中 int 字段的默认填充是什么?
- java - JApplet Restart 添加重复的组件
- sql - 在 SQL Server 中看不到数据库图表选项
- arduino - 使用枚举切换不起作用 - Arduino Mega 2560
- java - 限制Java中的并发线程数
- c# - 删除 C# 中的最后两个目录
- drupal-8 - 尝试安装 JSON API 和支持模块时的 Drupal 8 白页