问题 使用Hive,S3,EMR和Recover Partitions加载数据


解决了: 有关此问题的“解决方案”,请参阅下面的更新#2。

~~~~~~~

在s3中,我有一些log * .gz文件存储在嵌套目录结构中,如:

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

我试图使用多级分区规范将这些加载到Hlastic on Elastic Map Reduce(EMR)上,如:

create external table logs (content string)
partitioned by (y string, m string, d string, h string)
location 's3://($BUCKET)';

创建表工作。然后我尝试恢复所有现有分区:

alter table logs recover partitions;

这似乎工作,它确实钻取我的s3结构并添加所有不同级别的目录:

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08
y=2012/m=11/d=06/h=09
y=2012/m=11/d=06/h=10
y=2012/m=11/d=06/h=11
y=2012/m=11/d=06/h=12
y=2012/m=11/d=06/h=13
y=2012/m=11/d=06/h=14
y=2012/m=11/d=06/h=15
y=2012/m=11/d=06/h=16
...

因此,Hive似乎可以成功查看和解释我的文件布局。但是,没有实际数据被加载。如果我尝试做一个简单的计数或选择*,我什么也得不到:

hive> select count(*) from logs;
...
OK
0

hive> select * from logs limit 10;
OK

hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10;
OK

思考?我是否缺少一些额外的命令来加载数据而不是恢复分区?

如果我手动添加具有显式位置的分区,那么它的工作原理如下:

alter table logs2 add partition (y='2012', m='11', d='09', h='10') location 's3://($BUCKET)/y=2012/m=11/d=09/H=10/'

我可以写一个脚本来做这件事,但感觉我错过了一些基本的w.r.t'恢复分区'。

更新#1

感谢Joe K在下面的评论中的精彩和敏锐的观察,我认为这里可能涉及区分大小写的问题。

文件肯定像下面的路径规范一样组织,大写H(我想这可能是对iso8601格式的一些点头):

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

我使用分区规范创建我的外部表,该规范执行正确的大小写:

partitioned by (y string, m string, d string, H string)

(注意'H')。我做了一个恢复分区,它似乎通过目录递归并适当地找到分区,但不知何故(尽管到目前为止在所有指导性地方使用'H'),Hive似乎确实将它保存为小写'h' :

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08

(注意'h')。所以似乎Hive能够发现分区,但是然后以小写形式存储它们......后来当它去寻找数据时,这些路径(当然)是空的,因为S3区分大小写。

我将把我的数据移动到一个全小写的目录结构,看看是否有效......

更新#2

实际上,我已经确认大写的'H'作为分区名称(在s3文件布局中)是这里的问题。据我所知,这就是发生的事情:

  • 我在S3上的布局有一个区分大小写的分区名称(H =)
  • 正确运行RECOVER PARTITIONS会发现这些分区......
  • 但是它们在内部存储为小写(h)

'recover partitions'命令是Amazon创建的Hive的扩展。我强烈怀疑这个bug是在这个组件中。据我所知,本地Hive没有探索分区发现的文件根的概念......


7282
2017-11-10 03:53


起源

如果其他人冒险沿着这条路走下去,这里有两个非常有用的博文: pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json 和 sites.google.com/a/khanacademy.org/forge/technical/data_n/... - Mike Repass
我注意到的一件事是你的小时分区列在帖子的不同部分有不同的情况。这可能是问题的一部分吗?我不确定S3 / Hive的哪些部分是区分大小写的。另外,当你这样做时输出是什么 describe formatted logs2 partition (y='2012', m='11', d='06', h='08')? - Joe K
乔!谢谢!我想你正在做点什么。我现在肯定看到的是行为敏感问题的症状。我想用更多信息更新我的问题。 - Mike Repass
乔 - 我欠你的接受。请添加关于区分大小写的答案,我会勾选它。再次感谢。 - Mike Repass
谢谢,帮帮我 - Balaji Boggaram Ramanarayan


答案:


这是小时场的一个案例问题!


10
2017-11-13 21:36