配置单元按不可见列排序

时间:2019-02-05 16:48:20

标签: hive bigdata hiveql

假设我的表test的列为a,b,而ctest2的列相同。我可以创建表测试的视图并将表2结合在一起并由表测试的字段c排序的测试2,而不在最终输出中显示它吗?就我而言:

CREATE VIEW AS test_view AS
SELECT a,b FROM (SELECT * FROM test ORDER BY c)
JOIN test2 ON test.a =test2.a;

好吧,我测试了它,因为混洗阶段是不可能的,所以也许有另一种解决方案吗?表太大,无法进行广播连接。

我当然可以做

CREATE VIEW AS test_view AS
SELECT a,b,c FROM test
JOIN test2 ON test.a =test2.a
ORDER BY c

然后

CREATE VIEW AS final_view AS
SELECT a,b FROM test_view;

但是这种解决方案不是最佳选择

有什么主意吗?

3 个答案:

答案 0 :(得分:1)

这是您正在看的吗?

CREATE VIEW AS test_view AS
SELECT a,b FROM 
(SELECT * FROM 
test t1 JOIN test2 t2
ON test.a =test2.a
ORDER BY t1.c
) abc;

答案 1 :(得分:0)

请考虑与上层表相同的视图。从中选择不返回有序数据集,仅上层查询保证顺序中的order by(或distribution + sort)。如果您将此视图具体化为已排序的表,则不能保证从中选择结果进行排序,因为该表是并行读取的,并且返回的行不是“原始顺序”。 古典理论说,有序表违反了第一个NF。 无法在符合SQL:2003的数据库中创建顺序视图。

按内部视图排序没有任何意义。因此,按视图中的不可见列进行排序也是没有意义的。 改为在上部查询中使用ORDER BY。 在上部查询保证单中仅order by(或分发+排序)。

答案 2 :(得分:0)

我最终得到

CREATE VIEW AS test_view AS
SELECT a,b,c FROM test
JOIN test2 ON test.a =test2.a
ORDER BY c

然后

CREATE VIEW AS final_view AS
SELECT a,b FROM test_view;

这可能不是最佳选择,但这只是使所有内容井井有条的保证方式,在我的情况下(大约4-5次加入),一目了然要容易得多。当然,我们也可以将test_view创建为临时视图,但这只是完善。

但是也许你们中的一些人有其他可行的解决方案-随时发布:)