【问题标题】:Hive order by not visible column按不可见列排列的 Hive 顺序
【发布时间】:2019-02-05 16:48:19
【问题描述】:

假设我有表 test 与列 a,bctest2 与同一列。我可以创建一个表 test 和 test 2 连接在一起并按表 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;

但是这个解决方案不是最优的

有什么想法吗?

【问题讨论】:

  • 这里的问题是什么,您要按选择列列表中不存在的列进行排序吗?
  • 是的,我想按 c 列排序,这在最终视图中不可见

标签: hive bigdata hiveql


【解决方案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;

【讨论】:

  • 此查询不能保证最终视图中的顺序,因为您在较低级别的查询中进行排序,因此当您对其进行较高级别的选择时,排序会丢失。
【解决方案2】:

将视图视为上层表。从中选择返回未排序的数据集,只有上层查询中的order by(或distribute+sort)保证顺序。如果将此视图具体化为已排序的表,不保证从中选择的结果是已排序的,因为该表是并行读取的,并且返回的行不是“原始顺序”。 经典理论认为有序表违反了第一 NF。 无法在符合 SQL:2003 的数据库中创建有序视图。

按内部视图排序是没有意义的。因此,按视图中的不可见列排序也没有任何意义。 在上层查询中使用 ORDER BY。 只有上层查询中的order by(或distribute+sort)才能保证顺序。

【讨论】:

    【解决方案3】:

    我结束了

    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 作为临时视图,但这只是润色。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2014-01-05
      • 1970-01-01
      相关资源
      最近更新 更多