AmazonEMR和hive:在将子目录加载到外部表时获得“java.io.ioexception:notafile”异常

mo49yndu  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(411)

我用的是亚马逊电子病历。我在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

有人知道怎么解决这个问题吗?

yx2lnoni

yx2lnoni1#

现在开始工作(2018年5月)
全局emr\u范围内的修复程序是在/ etc/spark/conf/spark-defaults.conf 文件:

spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive  true
hive.mapred.supports.subdirectories  true

或者,可以像下面的pyspark代码那样进行局部修复:

from pyspark.context import SparkContext
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL Hive integration example") \
    .enableHiveSupport() \
 .config("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true") \
        .config("hive.mapred.supports.subdirectories","true") \
        .getOrCreate()
        spark.sql("<YourQueryHere>").show()
5w9g7ksd

5w9g7ksd2#

这是一个特定于emr的问题,以下是我从amazon支持获得的信息:
不幸的是,hadoop不会递归地检查amazons3存储桶的子目录。输入文件必须直接位于指定的输入目录或amazons3 bucket中,而不是子目录中。根据这个文档(“您是在尝试递归遍历输入目录吗?”),看起来emr目前不支持递归目录。很抱歉给您带来不便。

unguejic

unguejic3#

问题在于您指定位置的方式
s3://bucketname/2014/08/
配置单元外部表希望此位置存在文件,但它有文件夹。
试着把路径

"s3://bucketname/2014/08/01/abc/,s3://bucketname/2014/08/01/xyz/"

你需要提供文件的路径。

相关问题