考虑:
select 1 as id, 2 as val
UNION ALL
select 2 as id, 1 as val
DISTRIBUTE BY id SORT BY valDISTRIBUTE BY是否只应用于第二个select表,还是应用于UNION ALL的结果,还有点模糊。
我是否需要一个子查询来确保DISTRIBUTE步骤仅在UNION ALL完成后应用,即
select * from (
select 1 as id, 2 as val
union all
select 2 as id, 1 as val
)
DISTRIBUTE BY id SORT BY val两个查询的EXPLAIN看起来都是一样的:
== Physical Plan ==
*(3) Sort [val#636 ASC NULLS FIRST], false, 0
+- Exchange hashpartitioning(id#635, 200)
+- Union
:- *(1) Project [1 AS id#635, 2 AS val#636]
: +- Scan OneRowRelation[]
+- *(2) Project [2 AS id#637, 1 AS val#638]
+- Scan OneRowRelation[]但我不清楚,对于更复杂的查询,情况总是如此(在我尝试过的更实际的用例中,一列的列别名#略有不同)。
发布于 2020-06-30 15:05:40
来自蜂巢文档
若要对单个SELECT应用ORDER、ORDER、ORDER、SELECT或place,请将子句放在括住SELECT的括号内: 选择key FROM (按键限制从src顺序选择键) subq1 UNION选择key FROM (按键限制从src1顺序选择键) subq2 若要向整个UNION结果应用ORDER、SORT、CLUSTER、DISTRIBUTE或last子句,请在最后一个UNION结果之后将顺序按、排序、按群集、按或限制排列。 下面的示例同时使用ORDER和clauses子句: 从src联合选择键,按键限制10从src1顺序选择键
因此,在您的例子中,DISTRIBUTE子句将应用于UNION的整个结果。
https://stackoverflow.com/questions/62520791
复制相似问题