无法从HDFS读取CSV文件创建HIVE表格

8

我在使用HDFS读取.csv文件并在Hive中创建表时遇到了问题。以下是查询语句:

CREATE EXTERNAL TABLE testmail (memberId String , email String, sentdate String,actiontype String, actiondate String, campaignid String,campaignname String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION '/user/hadoop/cloudera/ameeth/ca_email.csv';

获取错误。

元数据出错:MetaException(message:hdfs://PC:8020/user/hadoop/cloudera/ameeth/ca_email.csv 不是一个目录或无法创建目录)

请问有人能帮我解决这个问题吗?实际上,我想将这些语句作为一个作业在.sql文件中运行。

4个回答

17

Hive会从你在LOCATION中指定的目录中选择所有文件。您无需指定文件名。

这应该可以正常工作:

CREATE EXTERNAL TABLE testmail (memberId String , email String, sentdate String,actiontype String, actiondate String, campaignid String,campaignname String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hadoop/cloudera/ameeth';

谢谢,它正在工作。但是如果我按照以下格式提供它,它会抛出错误。 - Blue Whale
1
创建外部表testmail(memberId字符串,电子邮件字符串,发送日期字符串,操作类型字符串,操作日期字符串,活动ID字符串,活动名称字符串)行格式分隔符为',';将本地路径'/user/hadoop/cloudera/ameeth/ca_email.csv'中的数据加载到testmail表中; - Blue Whale
你能执行 hadoop fs -ls user/hadoop/cloudera/ameeth/ca_email.csv 并分享输出结果吗? - Abhishek Pathak
2
傻瓜,我真是太傻了。你正在下达从LOCAL INPATH加载数据的命令。因此,Hive试图在您的本地文件系统上定位路径,而不是在HDFS上。如果您指定了HDFS路径,请改用INPATH而不是LOCAL INPATH。 - Abhishek Pathak
2
如果在同一位置有两个文件(.txt),Hive如何找出要加载哪个文件? - venkat
显示剩余3条评论

0
在HDFS上创建一个目录,并将您的ca_email.csv文件移动到该目录中,然后将该目录指定为CREATE EXTERNAL TABLE命令的LOCATION。

0

前往此路径

在Cloudera中找到您的metastore_db文件夹并删除*.lck文件

命令 sudo rm /folder_path/metastore_db/*.lck


0

我遇到了同样的问题。

我把 CSV 文件改成了制表符分隔的文本文件,将文件移动到了 HDFS 中,并通过加载相同的文件创建 Hive 表,这个方法行得通。

你可以在 HDFS 中查看文件,以确保数据按照预期已经用制表符分隔,并加载到 Hive 表中。

CREATE TABLE TABLE1
( 
     column1 string,
     column2 string,
     ....
     ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
)LOAD DATA INPATH <hdfs location of tab delimited txt file> OVERWRITE INTO TABLE TABLE1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接