@@ -264,15 +264,13 @@ object GeneratorNestedColumnAliasing {
264
264
val exprsToPrune = projectList ++ g.generator.children
265
265
NestedColumnAliasing .getAliasSubMap(exprsToPrune).map {
266
266
case (nestedFieldToAlias, attrToAliases) =>
267
- // Defer updating `Generate.unrequiredChildIndex` to next round of `ColumnPruning`.
268
-
269
267
val (nestedFieldsOnGenerator, nestedFieldsNotOnGenerator) =
270
268
nestedFieldOnGeneratorOutput(nestedFieldToAlias, g.qualifiedGeneratorOutput)
271
269
val (attrToAliasesOnGenerator, attrToAliasesNotOnGenerator) =
272
270
aliasesOnGeneratorOutput(attrToAliases, g.qualifiedGeneratorOutput)
273
271
274
- // Push nested column accessors through `Generator`. We cannot prune on `Generator`'s
275
- // output .
272
+ // Push nested column accessors through `Generator`.
273
+ // Defer updating `Generate.unrequiredChildIndex` to next round of `ColumnPruning` .
276
274
val newChild = NestedColumnAliasing .replaceWithAliases(g,
277
275
nestedFieldsNotOnGenerator, attrToAliasesNotOnGenerator)
278
276
val pushedThrough = Project (NestedColumnAliasing
@@ -282,15 +280,18 @@ object GeneratorNestedColumnAliasing {
282
280
// For multiple field case, we cannot directly move field extractor into
283
281
// the generator expression. A workaround is to re-construct array of struct
284
282
// from multiple fields. But it will be more complicated and may not worth.
285
- if (nestedFieldsOnGenerator.size == 1 ) {
283
+ // TODO(SPARK-34956): support multiple fields.
284
+ if (nestedFieldsOnGenerator.size > 1 || nestedFieldsOnGenerator.size == 0 ) {
285
+ pushedThrough
286
+ } else {
286
287
// Only one nested column accessor.
287
288
// E.g., df.select(explode($"items").as("item")).select($"item.a")
288
289
pushedThrough match {
289
290
case p @ Project (_, newG : Generate ) =>
290
291
// Replace the child expression of `ExplodeBase` generator with
291
292
// nested column accessor.
292
- // E.g., df.select(explode($"items").as("item")) =>
293
- // df.select(explode($"items.a").as("item"))
293
+ // E.g., df.select(explode($"items").as("item")).select($"item.a") =>
294
+ // df.select(explode($"items.a").as("item.a "))
294
295
val rewrittenG = newG.transformExpressions {
295
296
case e : ExplodeBase =>
296
297
val extractor = nestedFieldsOnGenerator.head._1.transformUp {
@@ -322,8 +323,6 @@ object GeneratorNestedColumnAliasing {
322
323
323
324
case _ => pushedThrough
324
325
}
325
- } else {
326
- pushedThrough
327
326
}
328
327
}
329
328
0 commit comments