Hive 按不可见列排列的配置单元顺序

Hive 按不可见列排列的配置单元顺序,hive,bigdata,hiveql,Hive,Bigdata,Hiveql,假设我有一个包含列a、b和c的表test,以及包含相同列的test2。我是否可以创建一个表test和test2的视图,该视图由表test中的字段c连接并排序,而不在最终输出中显示它?就我而言: CREATE VIEW AS test_view AS SELECT a,b FROM (SELECT * FROM test ORDER BY c) JOIN test2 ON test.a =test2.a; 好的,我测试了它,但这是不可能的,因为洗牌阶段,所以可能有另一个解决方案,以某种方式做到这

假设我有一个包含列a、b和c的表test,以及包含相同列的test2。我是否可以创建一个表test和test2的视图,该视图由表test中的字段c连接并排序,而不在最终输出中显示它?就我而言:

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;
但这个解决方案并不是最优的

有什么想法吗?

考虑将视图与上层的表相同。Select from返回非有序数据集,只有order by或distribute+sort在较高的查询顺序中才能保证顺序。如果将此视图具体化为已排序的表,则不能保证从中选择的结果被排序,因为该表是并行读取的,并且返回的行不是原始顺序。经典理论认为有序表违反了第一个NF。 无法在符合SQL:2003的数据库中创建有序视图


按内部视图排序毫无意义。因此,视图中不可见列的顺序也没有意义。改为在上面的查询中使用ORDER BY。在上面的查询中,只有order by或distribute+sort可以保证顺序。

这就是您所看到的吗

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;
我最终得到了

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_视图创建为temp视图,但这只是抛光


但也许你们中的一些人还有其他可行的解决方案——请随意发布:

这里的问题是什么,您想按“选择列”列表中不存在的列进行排序吗?是,我想按c列排序,该列在最终视图中不可见。此查询不会保证最终视图中的顺序,因为您在较低级别的查询中排序,因此在执行较高级别的选择时,排序将丢失。