// SQLs borrowed from https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView
val sqlText = """
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid
"""
// Register pageAds table
Seq(
("front_page", Array(1, 2, 3)),
("contact_page", Array(3, 4, 5)))
.toDF("pageid", "adid_list")
.createOrReplaceTempView("pageAds")
val query = sql(sqlText)
val logicalPlan = query.queryExecution.logical
scala> println(logicalPlan.numberedTreeString)
00 'Project ['pageid, 'adid]
01 +- 'Generate 'explode('adid_list), false, adtable, ['adid]
02 +- 'UnresolvedRelation `pageAds`
import org.apache.spark.sql.catalyst.plans.logical.Generate
val generator = logicalPlan.collectFirst { case g: Generate => g.generator }.get
scala> :type generator
org.apache.spark.sql.catalyst.expressions.Generator
import org.apache.spark.sql.catalyst.analysis.UnresolvedGenerator
scala> generator.isInstanceOf[UnresolvedGenerator]
res1: Boolean = true
UnresolvedGenerator Expression
UnresolvedGenerator
is a Generator that represents an unresolved generator in a logical query plan.
UnresolvedGenerator
is created exclusively when AstBuilder
is requested to withGenerate (as part of Generate logical operator) for SQL’s LATERAL VIEW
(in SELECT
or FROM
clauses).
UnresolvedGenerator
can never be resolved (and is replaced at analysis phase).
Given UnresolvedGenerator
can never be resolved it should not come as a surprise that it cannot be evaluated either (i.e. produce a value given an internal row). When requested to evaluate, UnresolvedGenerator
simply reports a UnsupportedOperationException
.
Cannot evaluate expression: [this]
Note
|
|
Note
|
UnresolvedGenerator is similar to UnresolvedFunction and differs mostly by the type (to make Spark development with Scala easier?)
|
Creating UnresolvedGenerator Instance
UnresolvedGenerator
takes the following when created:
-
Child expressions