我无法使用Hive访问AWS S3上的文件夹,可能是该目录中的零长度文件是原因。 AWS管理控制台的文件夹是一个零字节对象,其键以斜杠结尾,即" folder_name /"。我认为Hive或Hadoop可能在如何定义S3上的文件夹方案方面存在错误。
这就是我所做的。
CREATE EXTERNAL TABLE is_data_original (user_id STRING, action_name STRING, timestamp STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION 's3n://bucketname/logs/';
SELECT * FROM is_data_original LIMIT 10;
异常java.io.IOException失败:java.lang.NullPointerException
username@client:~$ hadoop fs -ls s3n://bucketname/logs/
Found 4 items
-rwxrwxrwx 1 0 2015-01-22 20:30 /logs/data
-rwxrwxrwx 1 8947 2015-02-27 18:57 /logs/data_2015-02-13.csv
-rwxrwxrwx 1 7912 2015-02-27 18:57 /logs/data_2015-02-14.csv
-rwxrwxrwx 1 16786 2015-02-27 18:57 /logs/data_2015-02-15.csv
hadoop fs -mkdir s3n://bucketname/copylogs/
hadoop fs -cp s3n://bucketname/logs/*.csv s3n://bucketname/copylogs/
username@client:~$ hadoop fs -ls s3n://bucketname/copylogs/
Found 3 items
-rwxrwxrwx 1 8947 2015-02-28 05:09 /copylogs/data_2015-02-13.csv
-rwxrwxrwx 1 7912 2015-02-28 05:09 /copylogs/data_2015-02-14.csv
-rwxrwxrwx 1 16786 2015-02-28 05:09 /copylogs/data_2015-02-15.csv
CREATE EXTERNAL TABLE is_data_copy (user_id STRING, action_name STRING, timestamp STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION 's3n://bucketname/copylogs/';
SELECT * FROM is_data_copy LIMIT 10;
后者在复制后工作正常。
以下两个命令都有效:
hadoop fs -cat s3n://bucketname/logs/data_2015-02-15.csv
hadoop fs -cat s3n://bucketname/copylogs/data_2015-02-15.csv
版本: Hive 0.11.0 和 Hadoop 1.0.3。
这是某种错误吗?它与AWS S3有关吗?有任何想法吗?我需要能够读取原始位置,因为这是数据不断流动的地方。
我无法控制创建目录并在其中放置日志文件的进程,因此我无法检查任何内容。
我进行了一项实验:在S3上创建了一个密钥/文件夹,并以两种不同的方式在其中放置了一个文件:使用AWS管理控制台并使用hadoop fs。 我可以在文件夹中看到一个零字节文件,以防我使用AWS控制台,我得到一个空指针异常,用Hive评估它。有了hadoop fs,我不会遇到这样的问题。我假设,该零字节文件应该被删除,但不是AWS Console的情况。我确信,在我的情况下,s3文件夹不是从AWS控制台创建的,但可能是Ruby或Javascript。
答案 0 :(得分:0)
好像是一个Hive bug。 Hive 0.12.0没有这个问题。