在 HIVE 上联合两个选择

Posted

技术标签:

【中文标题】在 HIVE 上联合两个选择【英文标题】:UNION TWO SELECT ON HIVE 【发布时间】:2021-07-07 13:15:48 【问题描述】:

我在 HIVE 上有一个类似的数据库。

+--------+------------------+---------+
| rating |    date_upd      | version |
+--------+------------------+---------+
| 3      | 2021-07-01 12:13 | 2.1.9   |
| 5      | 2021-07-01 10:39 | 2.2.6   |
| 4      | 2021-07-02 10:24 | 2.2.7   |
| 5      | 2021-07-02 05:37 | 3.2.4   |
| 1      | 2021-07-02 21:40 | 3.2.5   |

我需要在另一个表中发送两个 SELECT 的结果。如何使用 HiveQL 将这两者合并为一个?

SELECT substr('date_upd',1,10) as 'day',
       count(*) cnt 
FROM tbl_one 
GROUP BY
       substr(date_upd,1,10);


SELECT substr('date_upd',1,7) as 'month',
       count(*) cnt 
FROM table_name 
GROUP BY
      substr('date_upd',1,7);

当我这样做时,它只返回“日”值而不是“月”值。

SELECT 
      substr('date_upd',1,7) as 'month',
      count(*) cnt_month,
      substr('date_upd',1,10) as 'day',
      count(*) cnt_day
FROM table_name 
GROUP BY
      substr('date_upd',1,7),
      substr('date_upd',1,10);

【问题讨论】:

你想要什么结果?只需将union all 放在前两个查询之间即可。 它在运行时返回此错误:` SELECT ... GROUP BY substr('date_upd',1,10) UNION ALL SELECT ... GROUP BY substr('date_upd',1,7 ) ` 编译语句时出错:FAILED: SemanticException 19:5 联合双方的架构应该匹配。 _u1-subquery2 没有字段 day。在令牌“table_name”附近遇到错误 【参考方案1】:

这取决于合并对您意味着什么。如果您尝试垂直附加(从标题描述中听起来),您可以试试这个:

垂直追加:

联合:

如果您想在另一份报告之后立即打印一份报告,只需执行 UNION 声明

SELECT substr('date_upd',1,10) as 'day',
       count(*) cnt 
FROM tbl_one 
GROUP BY
       substr(date_upd,1,10);

UNION -- this is the operator you are looking for

SELECT substr('date_upd',1,7) as 'month',
       count(*) cnt 
FROM tbl_one 
GROUP BY
      substr('date_upd',1,7);

水平追加:

加入

但是,如果您尝试水平显示内容,您可能应该使用基于连接的方法(比窗口函数更简单),可能会在月份加入并带来所有 monht_date 和 day_date 列(如果您想实际放置这些列并一个接一个地计数)。

day count_day month count_month
2021-07-01 12:13 2 2021-07 45
2021-07-02 11:07 5 2021-07 45
2021-07-05 07:22 3 2021-07 45

窗口功能:

如果您不想重复列,您可以使用具有分区级别的窗口函数直接在不同级别上聚合。但这显然更先进,可能不是所要求的。只是指路。

你会得到类似的东西:

date count_day count_month
2021-07-01 12:13 2 45
2021-07-02 11:07 5 45
2021-07-05 07:22 3 45

【讨论】:

在这种情况下,它首先执行 SELECT,而不执行第二个并作为不同的查询。 我想带上 HORIZONTAL APPEND,但每当我尝试某些东西时,它都会抱怨 GROUP BY。

以上是关于在 HIVE 上联合两个选择的主要内容,如果未能解决你的问题,请参考以下文章

小程序里两个表单怎么合并成一个表格

如何在 HIVE hql 中添加两个计数?

为啥 hive 在 Join 操作期间不选择 SerDe JAR?

HIVE:如何仅从两个表中的两列中选择第三个表中不存在的不同值?

戴尔的电脑怎么里面有两个系统盘(一个是C另一个是OS),怎么合并成一个盘,c盘太小了……求高手……

从 MS-Access 中联合选择查询中的 SQLite 语法错误