为Hive表提供1000列:
col1, col2, ..., col1000
源表包含数十亿行,大小约为1PB。
我只需要查询3列,
select col1, col2, sum(col3) as col3
from myTable
group by
col1, col2
是否建议首先执行子查询,然后将其发送到group by的聚合,以便我们将更小的文件发送到groupby?不确定Hive会自动解决这个问题。
select col1, col2, sum(col3) as col3
from
(select col1, col2, col3
from myTable
) a
group by
col1, col2
答案 0 :(得分:0)
在幕后,如果您进行子查询不应该是真的重要,但是您可以查看每个查询的解释计划,看看它们之间是否存在任何差异。
理想情况是您的表格将以列式格式存储,因此如果将来会使用这样的大量查询,那么我会确保您的表格存储为使用柱状存储和将为您提供出色的查询性能。
如果它不是这种格式,那么您可以使用create as select语句创建一个新表。
create table yourNewParquetTable stored as parquet as select * from yourOldTable;
答案 1 :(得分:0)
通常,在这种情况下没有理由使用子查询。你基本上有两种情况:
首先,Hive可以存储/获取所有列。在这种情况下,Hive需要读取子查询或聚合的所有列中的所有数据。
否则,Hive只能存储/获取您需要的列。在这种情况下,Hive会对这两个版本都这样做。
尽管如此,有理由避免在某些数据库中使用子查询。 MySQL实现子查询 - 意味着它们被存储为临时表。这是不必要的开销,是避免使用MySQL进行不必要的子查询的一个很好的理由。蜂巢不会这样做。它在数据流中编译查询并执行数据流。