两个Hive分区可以共享一组文件吗?

时间:2014-05-27 23:51:19

标签: sql hadoop hive partition

一个典型的问题是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次。例如,在第一个"我的意思"上面的代码块,分区20120101..20120103都指向文件201201 / file1.tsv。所以如果查询有:

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

它会读到&#34; 201201 / file1.tsv&#34;三次回答查询?或者Hive是否足够聪明,只知道扫描&#34; 201201 / file1.tsv&#34;一次?

2 个答案:

答案 0 :(得分:2)

看起来Hive只扫描文件一次。我终于决定试一试并运行查询并找出答案。

首先,我在文件系统中设置了这样的数据集:

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

请注意,即使我有很多文件,但这相当于Hive有一个巨大的文件用于此问题。如果它更容易,假装我只粘贴了一个文件。

然后我用这样的分区设置我的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

所以它认为只有一个&#34; dt&#34;,那是最后的&#34;分区&#34;,它有所有行。所以你必须要非常小心,包括&#34; dt&#34;在你的查询中,当你这样做时,它会出现。

答案 1 :(得分:0)

Hive会多次扫描文件。早期答案不正确。 Hive读取文件一次,但生成“重复”记录。问题是分区列包含在总记录中,因此对于文件中的每个记录,您将在Hive中获得多个记录,每个记录具有不同的分区值。

您是否有办法从早期数据中恢复实际日期?如果是这样,理想的做法是完全重新分配所有旧数据。这很痛苦,但这是一次性费用,可以省去你有一个非常奇怪的Hive表。

您还可以使用两个Hive表:按月分区的“旧”表和按日分区的“新”表。然后,用户可以在查询时对这两者进行联合,或者您可以创建一个自动执行联合的视图。