2016-03-27 19 views
0

举一个蜂房表1000组的列:从1000列的Hive表执行groupby 2属性的建议方式是什么?

col1, col2, ..., col1000 

源表包含数十亿行的,并且尺寸为约1PB。

我只需要查询3列,

select col1, col2, sum(col3) as col3 
from myTable 
group by 
col1, col2 

它是否将建议先做一个子查询,然后将其发送到组由聚集,所以,我们有很多小的文件发送到GROUPBY ?不确定它Hive会自动处理这个问题。

select col1, col2, sum(col3) as col3 
from 
    (select col1, col2, col3 
    from myTable 
    ) a 
group by 
col1, col2 

回答

0

在幕后,如果你做一个子查询或不是应该没有真正的问题,但你可以看看每个查询的解释计划,看看你是否注意到它们之间的差异。

理想的情况是将你的表格以列格式存储起来,所以如果将来会使用很多这样的查询,那么我会确保你的表格存储为使用列存储的地板文件并会给你优秀的查询性能。

如果它不是这种格式,那么您可以使用create as select语句创建一个新表。

create table yourNewParquetTable stored as parquet as select * from yourOldTable; 
0

通常,在这种情况下没有理由使用子查询。你基本上有两种情况:

首先,Hive可以一起存储/获取所有列。在这种情况下,Hive需要读取子查询或聚合的所有列中的所有数据。

否则,Hive只能存储/提取您需要的列。在这种情况下,Hive会为这两个版本都这样做。

这就是说,有些数据库中有一个避免子查询的原因。 MySQL实现了子查询 - 意味着它们就像是临时表一样存储。这是不必要的开销,也是避免MySQL不必要的子查询的一个很好的理由。 Hive不这样做。它编译数据流中的查询并执行数据流。

相关问题