Amazon EMR和Hive:将子目录加载到外部表时获取"java.io.IOException:Not a file"异常

mar*_*nun 2 hadoop hive amazon-s3 amazon-web-services emr

我正在使用Amazon EMR.我在s3中有一些日志数据,都在同一个桶中,但在不同的子目录下,如:

"s3://bucketname/2014/08/01/abc/file1.bz"
"s3://bucketname/2014/08/01/abc/file2.bz"
"s3://bucketname/2014/08/01/xyz/file1.bz"
"s3://bucketname/2014/08/01/xyz/file3.bz"
Run Code Online (Sandbox Code Playgroud)

我正在使用 :

Set hive.mapred.supports.subdirectories=true;
Set mapred.input.dir.recursive=true;
Run Code Online (Sandbox Code Playgroud)

尝试加载"s3:// bucketname/2014/08 /"中的所有数据时:

CREATE EXTERNAL TABLE table1(id string, at string, 
          custom struct<param1:string, param2:string>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://bucketname/2014/08/';
Run Code Online (Sandbox Code Playgroud)

作为回报,我得到:

OK
Time taken: 0.169 seconds
Run Code Online (Sandbox Code Playgroud)

在尝试查询表时:

SELECT * FROM table1 LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

我明白了:

Failed with exception java.io.IOException:java.io.IOException: Not a file: s3://bucketname/2014/08/01
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何减少这个?

mar*_*nun 5

这是一个EMR特定的问题,这是我从亚马逊支持得到的:

不幸的是,Hadoop不会递归检查Amazon S3存储桶的子目录.输入文件必须直接在您指定的输入目录或Amazon S3存储桶中,而不是在子目录中.根据这个文档("你试图以递归方式遍历输入目录吗?")看起来EMR目前不支持递归目录.对于给您带来的不便,我们深表歉意.