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

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

它会读三遍“201201/file1.tsv”来回答查询吗?或者 Hive 会足够聪明,知道只需要扫描一次“201201/file1.tsv”吗?

4

2 回答 2

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

所以它认为只有一个“dt”,那是最后的“分区”,它有所有的行。因此,当您执行此操作时,您必须非常小心在查询中包含“dt”,它会出现。

于 2014-05-28T00:58:42.837 回答
0

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

您有什么方法可以从较早的数据中恢复实际日期吗?如果是这样,做事的理想方法是完全重新分区所有旧数据。这很痛苦,但这是一次性成本,并且会为您节省一张非常奇怪的 Hive 表。

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

于 2014-05-28T00:27:11.183 回答