一个典型的问题是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;一次?
答案 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表:按月分区的“旧”表和按日分区的“新”表。然后,用户可以在查询时对这两者进行联合,或者您可以创建一个自动执行联合的视图。