我用的是亚马逊电子病历。我在s3中有一些日志数据,都在同一个bucket中,但是在不同的子目录下,比如:
"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"
我正在使用:
Set hive.mapred.supports.subdirectories=true;
Set mapred.input.dir.recursive=true;
尝试从“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/';
作为回报,我得到:
OK
Time taken: 0.169 seconds
尝试查询表时:
SELECT * FROM table1 LIMIT 10;
我得到:
Failed with exception java.io.IOException:java.io.IOException: Not a file: s3://bucketname/2014/08/01
有人知道怎么解决这个问题吗?
3条答案
按热度按时间yx2lnoni1#
现在开始工作(2018年5月)
全局emr\u范围内的修复程序是在/
etc/spark/conf/spark-defaults.conf
文件:或者,可以像下面的pyspark代码那样进行局部修复:
5w9g7ksd2#
这是一个特定于emr的问题,以下是我从amazon支持获得的信息:
不幸的是,hadoop不会递归地检查amazons3存储桶的子目录。输入文件必须直接位于指定的输入目录或amazons3 bucket中,而不是子目录中。根据这个文档(“您是在尝试递归遍历输入目录吗?”),看起来emr目前不支持递归目录。很抱歉给您带来不便。
unguejic3#
问题在于您指定位置的方式
s3://bucketname/2014/08/
配置单元外部表希望此位置存在文件,但它有文件夹。
试着把路径
你需要提供文件的路径。