hadoop - 使用 Hive、S3、EMR 和恢复分区加载数据

标签 hadoop amazon-s3 amazon-web-services hive elastic-map-reduce

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

~~~~~~~

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

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

我正在尝试将这些加载到 Elastic Map Reduce (EMR) 上的 Hive,使用多级分区规范,例如:

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)

“恢复分区”命令是 Amazon 编写的 Hive 的扩展。我强烈怀疑这个错误是在这个组件中。据我所知, native Hive 没有为分区发现探索文件根的概念......

最佳答案

小时字段的大小写问题!

关于hadoop - 使用 Hive、S3、EMR 和恢复分区加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13319080/

相关文章:

amazon-web-services - "Invalid lambda function"尝试配置 SES 电子邮件接收规则时

python - 在 apache spark/Storm 中运行 python 脚本

hadoop - 在 Hadoop 中如何处理每天增加的数据

python - 如何将 pyarrow parquet 数据写入 s3 存储桶?

amazon-web-services - 如何使用不同的 --endpoint-url 同步 S3 存储桶

amazon-web-services - 为什么通过Session Manager访问私有(private)EC2实例需要NAT网关?

hadoop - 将数据从Cloudera移至Amazon S3存储桶

hadoop - 从AWS s3提取文件样本并将其放置在s3中的另一个位置

java - 使用 Java API : "hostname in certificate didn' t match"的 S3/AWS 的 SSL 问题

c# - S3 和 .net Amazon SDK - 由于保护级别,GetObject 无法访问