【问题标题】:Combining two queries where one uses GROUP BY组合两个查询,其中一个使用 GROUP BY
【发布时间】:2015-07-27 17:11:28
【问题描述】:

我有两张桌子。 TABLE1 有列:

pers_key
cost
visit

TABLE2 有列:

pers_key
months

首先,我创建一个临时表:

CREATE TABLE temp_table as
SELECT pers_key,SUM(cost) AS sum_cost, COUNT(DISTINCT visit) AS visit_count
FROM TABLE1
GROUP BY pers_key;

然后,我创建 TABLE3:

CREATE TABLE TABLE3 as
SELECT A.pers_key,
B.sum_cost/A.months AS ind1,
B.visit_count/A.months AS ind2
FROM TABLE2 AS A, temp_table AS B
WHERE A.pers_key = B.pers_key

我想知道这里是否有更好的方法来实现相同的结果。是否可以在一个查询中执行此操作而无需完全创建 temp_table?也许是这样的:

CREATE TABLE TABLE3 as
SELECT A.pers_key,
(SUM(B.cost)over (partition by B.pers_key))/A.months AS ind1,
(COUNT(B.visit)over (partition by B.pers_key))/A.months AS ind2
FROM TABLE2 AS A, TABLE1 AS B
WHERE A.pers_key = B.pers_key

还是需要临时表才能达到想要的结果集?

【问题讨论】:

  • 您是否尝试过使用联合来组合它们。 IE。 select Col1, Col2 from table1 union select Col1, Col2 from table2.

标签: sql group-by hive aggregate-functions hiveql


【解决方案1】:

只使用子查询怎么样?

SELECT A.pers_key,
       B.sum_cost / A.months AS ind1,
       B.visit_count / A.months AS ind2
FROM TABLE2 A JOIN
     (SELECT pers_key, SUM(cost) AS sum_cost,
             COUNT(DISTINCT visit) AS visit_count
      FROM TABLE1
      GROUP BY pers_key
     ) B
     ON A.pers_key = B.pers_key;

编辑:

你的问题有点复杂。这绝对是一个合理的方法。将子查询放在表中并在表上为连接建立索引可能会更快。但是,一个危险信号是count(distinct)。根据我使用 Hive 的经验,以下方法比上述子查询更快:

     (SELECT pers_key, SUM(sum_cost) AS sum_cost,
             COUNT(visit) AS visit_count
      FROM (SELECT pers_key, visit, SUM(cost) as sum_cost
            FROM TABLE1
            GROUP BY pers_key, visit
           ) t
      GROUP BY pers_key
     ) B

这个版本更快,这有点违反直觉(对我来说)。但是,group by 是 Hive 很容易并行化 group bys。另一方面,count(distinct) 是串行处理的。这有时会发生在其他数据库中(我在 Postgres 中使用 count(distinct) 看到过类似的行为。另外需要注意的是:我没有在发现此问题的地方设置 Hive 系统,因此可能是某种配置问题。

【讨论】:

  • 这很棒。最后一个问题。如果表都是数百万行,这是生成所需结果集的最有效方法吗?
  • 计数(不同的访问)将强制使用单个减速器。这不是最有效的。对 distinct 使用子查询:Select count(*), pers_key from (select visit, perskey from table group by perskey, visit) t.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多