背景
对于在在RangeExec中出现的GenerateUnsafeProjection.createCode的方法进行说明
分析
对应的代码为:
def createCode(
ctx: CodegenContext,
expressions: Seq[Expression],
useSubexprElimination: Boolean = false): ExprCode = {
val exprEvals = ctx.generateExpressions(expressions, useSubexprElimination)
val exprSchemas = expressions.map(e => Schema(e.dataType, e.nullable))
val numVarLenFields = exprSchemas.count {
case Schema(dt, _) => !UnsafeRow.isFixedLength(dt)
// TODO: consider large decimal and interval type
}
val rowWriterClass = classOf[UnsafeRowWriter].getName
val rowWriter = ctx.addMutableState(rowWriterClass, "rowWriter",
v => s"$v = new $rowWriterClass(${expressions.length}, ${numVarLenFields * 32});")
// Evaluate all the subexpression.
val evalSubexpr = ctx.subexprFunctionsCode
val writeExpressions = writeExpressionsToBuffer(
c
Spark SQL执行优化:UnsafeRow与代码生成

本文详细解析了Spark SQL中RangeExec执行过程中GenerateUnsafeProjection的createCode方法,涉及代码生成、UnsafeRowWriter的使用以及非固定长度字段的处理。通过对表达式序列的处理,生成用于写入数据的表达式代码,并最终组装成ExprCode,用于执行阶段。
最低0.47元/天 解锁文章
3014

被折叠的 条评论
为什么被折叠?



