CreateNamedStruct¶
CreateNamedStruct is an Expression.
Creating Instance¶
CreateNamedStruct takes the following to be created:
- Child Expressions
CreateNamedStruct is created when:
SerializerBuildHelperutility is used to createSerializerForObjectResolveExpressionsWithNamePlaceholderslogical analysis rule is executedResolveUnionlogical analysis rule is executed- Catalyst DSL's
namedStructoperator is used ExpressionEncoderis createdRowEncoderutility is used to create a serializer for a StructTypeCreateStructutility is used to create a CreateNamedStructObjectSerializerPruninglogical optimization is executed- many many others
Never Nullable¶
nullable is always disabled (false).
nullable is part of the Expression abstraction.
Node Patterns¶
nodePatterns is CREATE_NAMED_STRUCT.
nodePatterns is part of the TreeNode abstraction.
Pretty Name¶
prettyName is either function alias for the functionAliasName tag (if defined) or named_struct.
prettyName is part of the Expression abstraction.
Interpreted Expression Evaluation¶
eval creates an InternalRow with the result of evaluation of all the value expressions.
eval is part of the Expression abstraction.
Code-Generated Expression Evaluation¶
doGenCode is part of the Expression abstraction.
import org.apache.spark.sql.functions.lit
val exprs = Seq("a", 1).map(lit).map(_.expr)
import org.apache.spark.sql.catalyst.dsl.expressions._
val ns = namedStruct(exprs: _*)
// doGenCode is used when Expression.genCode is executed
import org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext
val ctx = new CodegenContext
val code = ns.genCode(ctx).code
scala> println(code)
Object[] values_0 = new Object[1];
if (false) {
values_0[0] = null;
} else {
values_0[0] = 1;
}
final InternalRow value_0 = new org.apache.spark.sql.catalyst.expressions.GenericInternalRow(values_0);
values_0 = null;
FunctionRegistry¶
CreateNamedStruct is registered in FunctionRegistry under the name of named_struct SQL function.
import org.apache.spark.sql.catalyst.FunctionIdentifier
val fid = FunctionIdentifier(funcName = "named_struct")
val className = spark.sessionState.functionRegistry.lookupFunction(fid).get.getClassName
val q = sql("SELECT named_struct('id', 0)")
// analyzed so the function is resolved already (using FunctionRegistry)
val analyzedPlan = q.queryExecution.analyzed
scala> println(analyzedPlan.numberedTreeString)
00 Project [named_struct(id, 0) AS named_struct(id, 0)#7]
01 +- OneRowRelation
val e = analyzedPlan.expressions.head.children.head
import org.apache.spark.sql.catalyst.expressions.CreateNamedStruct
assert(e.isInstanceOf[CreateNamedStruct])
Catalyst DSL¶
Catalyst DSL defines namedStruct operator to create a CreateNamedStruct expression.