Sql 两个配置单元分区可以共享一组文件吗?

Sql 两个配置单元分区可以共享一组文件吗?,sql,hadoop,hive,partition,Sql,Hadoop,Hive,Partition,一个典型的问题是,一个配置单元分区是否可以由多个文件组成。我的问题正好相反。多个配置单元分区能否指向同一个文件?我将从我的意思开始,然后是用例 我的意思是: Hive Partition File Name 20120101 /file/location/201201/file1.tsv 20120102 /file/location/201201/file1.tsv 20120103 /file/location/20

一个典型的问题是,一个配置单元分区是否可以由多个文件组成。我的问题正好相反。多个配置单元分区能否指向同一个文件?我将从我的意思开始,然后是用例

我的意思是:

Hive Partition      File Name
20120101            /file/location/201201/file1.tsv
20120102            /file/location/201201/file1.tsv
20120103            /file/location/201201/file1.tsv
用例:在过去的许多年中,我们一直以每月的格式将数据加载到配置单元中。所以看起来是这样的:

Hive Partition      File Name
201201              /file/location/201201/file1.tsv
201202              /file/location/201202/file1.tsv
201203              /file/location/201203/file1.tsv
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/' ;
但是现在月份太多了,所以我们需要按天分区。因此,我们希望从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"
和partitionName>=“20120101”和partitionName配置单元将多次扫描该文件。先前的回答是不正确的。配置单元读取文件一次,但生成“重复”记录。问题是分区列包含在总记录中,因此对于文件中的每个记录,您将在配置单元中获得多个记录,每个记录具有不同的分区值

您是否有任何方法从早期数据恢复实际日期?如果是这样,理想的方法是完全重新划分所有旧数据。这是很痛苦的,但这是一次性的费用,可以让你不必拥有一个非常奇怪的蜂巢桌


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

看起来Hive只会扫描文件一次。我最后决定试一试,运行一个查询并找出答案

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

tableName/201301/splitFile-201301-xaaaa.tsv.gz
tableName/201301/splitFile-201301-xaaab.tsv.gz
...
tableName/201301/splitFile-201301-xaaaq.tsv.gz
请注意,尽管我有许多文件,但就本问题而言,对于Hive来说,这相当于有一个巨大的文件。如果让它更简单,就假装我只是在上面粘贴了一个文件

然后我用如下分区设置配置单元表:

Hive Partition      File Name
201201              /file/location/201201/file1.tsv
201202              /file/location/201202/file1.tsv
201203              /file/location/201203/file1.tsv
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中,我的文件的总大小约为791400000字节(我只是查看了数字并做了基本的数学计算)。我负责这项工作:

hive> select dt,count(*) from tableName where dt >= '20130101' and dt <= '20130112' group by dt ;
所以它只读取一次数据。然而。。。查询输出全部被劫持:

20130112    392606124

所以它认为只有一个“dt”,那是最后的“分区”,它有所有的行。因此,在执行此操作时,您必须非常小心地在查询中包含“dt”。我喜欢您关于两个表和一个并集的解决方案。重新划分当然是可能的,但这是一个相当庞大的项目。我做了一个测试,看起来你对Hive多次读取文件的看法不正确。啊,你是对的。我编辑而不是删除,因为我所说的其余部分仍然有意义。我在为我的答案做正确的标记,并警告说,下面的Joe K的解决方案虽然最初是错误的,但确实指出了一个相当好的替代解决方案,有一个“每月”表和一个“每日”表表,并要求分析员使用UNION对两个表进行相同的选择。如果以这种方式定义分区会产生负面的副作用,那么这可能是长期需要的。如果我真的发现了这些负面的副作用,我会回来评论。