2016-03-27 11 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

一般に、この状況でサブクエリを使用する理由はありません。基本的に2つの状況があります。

最初に、Hiveはすべての列を一緒に格納/フェッチできました。その場合、Hiveはサブクエリまたは集約のいずれかのすべての列のすべてのデータを読み取る必要があります。

それ以外の場合、Hiveは必要な列のみを格納/フェッチできます。その場合、Hiveはどちらのバージョンでもそうします。

つまり、一部のデータベースではサブクエリを避ける理由があります。 MySQLはサブクエリを実現します。つまり、一時テーブルであるかのように格納されます。これは不必要なオーバーヘッドであり、MySQLで不要なサブクエリを避ける良い理由です。ハイブはそれをしません。クエリをデータフローでコンパイルし、データフローを実行します。

関連する問題