背景
本文基于spark 3.2.0
由于codegen涉及到的知识点比较多,我们先来说清楚code"""""",我们暂且叫做code代码块
scala 字符串插值
要想搞清楚spark的code代码块,就得现搞清楚scala 字符串插值。
scala 字符串插值是2.10.0版本引用进来的新语法规则,可以直接允许使用者将变量引用直接插入到字符串中,如下:
val name = 'LI'
println(s"My name is $name")
输出:
My name is LI
这种资料很多,大家自行查阅资料理解。
code代码块
因为这块代码比较复杂,直接拿出例子来运行:
直接找到spark CastSuite.scala 第215行如下:
test("cast string to boolean II") {
checkEvaluation(cast("abc", BooleanType), null)
之后在javaCode.scala 输出对应的想要debug的值,如下:
*/
def code(args: Any*): Block = {
sc.checkLengths(args)
if (sc.parts.length == 0) {
EmptyBlock
} else {
args.foreach {
case _: ExprValue | _: Inline | _: Block =>
case _: Boolean | _: Byte | _: Int | _: Long | _: Float | _: Double | _: String =>
case other

本文深入探讨了Spark的代码生成机制,重点关注了Scala字符串插值和`code`代码块的概念。通过示例解释了`code`代码块如何在`CastSuite`测试用例中用于`castToBooleanCode`方法,展示了表达式值如何被替换并最终形成完整的执行代码。文章还阐述了`ExprCode`类的角色,以及如何通过连接子节点和父节点的`ExprCode`来构建代码生成的逻辑流程。理解这些概念对于掌握Spark的内核工作原理至关重要。
最低0.47元/天 解锁文章
1602

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



