1

よくある質問は、Hive パーティションを複数のファイルで構成できるかということです。私の質問は逆です。複数の Hive パーティションが同じファイルを指すことはできますか? 私が言いたいことから始めて、次にユースケースです。

私が意味したのは:

Hive Partition      File Name
20120101            /file/location/201201/file1.tsv
20120102            /file/location/201201/file1.tsv
20120103            /file/location/201201/file1.tsv

ユースケース: 過去何年にもわたって、データを毎月の形式で Hive にロードしてきました。したがって、次のようになりました。

Hive Partition      File Name
201201              /file/location/201201/file1.tsv
201202              /file/location/201202/file1.tsv
201203              /file/location/201203/file1.tsv

しかし、今は月が大きすぎるので、日ごとに分割する必要があります。したがって、201204 で始まる新しいファイルが毎日になるようにします。

Hive Partition      File Name
20120401            /file/location/20120401/file1.tsv
20120402            /file/location/20120402/file1.tsv
20120403            /file/location/20120403/file1.tsv

しかし、既存のすべてのパーティションも同様に毎日やり直したいので、上記で提案したようにパーティション化します。ファイルに対して定義された追加のパーティションごとに、Hive が同じデータファイルを N 回再読み取りすると思われることを除けば、これは実際には問題なく機能すると思います。たとえば、上記の最初の「What I Mean」コード ブロックでは、パーティション 20120101..20120103 はすべてファイル 201201/file1.tsv を指しています。したがって、クエリに次のものが含まれている場合:

and partitionName >= '20120101' and partitionName <= '20120103"

クエリに答えるために、「201201/file1.tsv」を 3 回読み取りますか? それとも、Hive は "201201/file1.tsv" を 1 回スキャンするだけでよいことを認識できるほどスマートでしょうか?

4

2 に答える 2

2

Hive はファイルを 1 回だけスキャンするようです。私は最終的に、試してみて、クエリを実行して調べることにしました。

まず、ファイルシステムで次のようにデータ セットをセットアップします。

tableName/201301/splitFile-201301-xaaaa.tsv.gz
tableName/201301/splitFile-201301-xaaab.tsv.gz
...
tableName/201301/splitFile-201301-xaaaq.tsv.gz

私には多くのファイルがありますが、これは、この質問の目的のために、Hive が 1 つの巨大なファイルを持つことと同等であることに注意してください。簡単にする場合は、上記の 1 つのファイルを貼り付けただけのふりをします。

次に、次のようなパーティションを使用して Hive テーブルをセットアップします。

alter table tableName add partition ( dt = '20130101' ) location '/tableName/201301/' ;
alter table tableName add partition ( dt = '20130102' ) location '/tableName/201301/' ;
...
alter table tableName add partition ( dt = '20130112' ) location '/tableName/201301/' ;

tableName/201301 内のファイルの合計サイズは約 791,400,000 バイトでした (数字を目で見て基本的な計算をしただけです)。私は仕事をしました:

hive> select dt,count(*) from tableName where dt >= '20130101' and dt <= '20130112' group by dt ;

JobTracker は次のように報告しました。

Counter     Map             Reduce    Total
Bytes Read  795,308,244     0         795,308,244

したがって、データは一度だけ読み取られます。ただし...クエリ出力はすべてジャックされました:

20130112    392606124

したがって、「dt」は 1 つしかなく、それが最後の「パーティション」であり、すべての行があったと考えられます。したがって、これを行う場合、クエリに「dt」を含めるように十分注意する必要があります。

于 2014-05-28T00:58:42.837 に答える
0

ハイブはファイルを複数回スキャンします。以前の答えは間違っていました。Hive はファイルを 1 回読み取りますが、「重複」レコードを生成します。問題は、パーティション列が合計レコードに含まれているため、ファイル内の各レコードに対して、Hive に複数のレコードが取得され、それぞれが異なるパーティション値を持つことです。

以前のデータから実際の日を復元する方法はありますか? もしそうなら、物事を行うための理想的な方法は、すべての古いデータを完全に再分割することです. 面倒ですが、これは 1 回限りのコストであり、非常に奇妙な Hive テーブルを作成する必要がなくなります。

月ごとにパーティション分割された「古い」テーブルと、日ごとにパーティション分割された「新しい」テーブルの 2 つの Hive テーブルを用意することもできます。その後、ユーザーはクエリを実行するときに 2 つの結合を実行できます。また、結合を自動的に実行するビューを作成することもできます。

于 2014-05-28T00:27:11.183 に答える