【发布时间】:2018-03-30 21:52:54
【问题描述】:
我在 hdfs 中有一个名为 test.csv 的 csv 文件。该文件通过filezilla放置在那里。当我使用与将文件放入 hdfs 相同的帐户凭据通过 putty 登录到 Edge 节点时,我能够查看文件的路径和内容。然后我连接到 Hive 并尝试使用以下语句创建一个外部表,指定我的 csv 文件在 hdfs 中的位置:
CREATE EXTERNAL TABLE(col1 string, col2 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS ORC LOCATION '/file path'
当我执行这个命令时,它会在 hive 上创建一个外部表,但是正在创建的表是空的,只显示了我在 create 语句中已经提到的列。我的问题是,我是否在上面的 create 语句中的 location 参数中指定了正确的路径?当我将 csv 文件放入 hdfs 格式为 home/servername/username/directory/subdirectory/file 时,我尝试使用在 filezilla 上看到的路径
但这会返回一个错误,指出在上述路径中指定用户名的用户在文件路径上没有所有权限。
注意:我检查了文件及其所在目录的权限,用户拥有所有权限(读、写和执行)。
然后我尝试将路径更改为 user/username/directory/subdirectory/file 格式,当我这样做时,我能够创建外部表,但是该表是空的,并且不会加载创建它的 csv 文件中的所有数据。
我还尝试了另一种创建内部表的方法,如下所示,然后使用LOAD DATA INPATH 命令。但这也失败了,因为我收到一条错误消息,提示“指定路径中不存在任何文件”。
CREATE TABLE foobar(key string, stats map<string, bigint>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':' ;
LOAD DATA INPATH '/tmp/foobar.csv' INTO TABLE foobar;
【问题讨论】:
-
这里有点困惑,你不是使用
hadoop fs -put <file>命令来上传文件到HDFS吗?当您说“文件通过filezilla放置在那里”时,不确定您的意思。您需要在 HDFS 上保存此文件,您可以使用hadoop fs -ls hdfs://hdfshostname/path/to/the/file检查该文件 -
我对此完全陌生,如果我没有使用正确的术语,请原谅我,但我的意思是我的 csv 文件已经在 hdfs 上,我无法将该文件加载到配置单元。这是我的主要问题。当我提到文件 zilla 时,我只是在谈论一个 FTP 应用程序,我用它来将文件放入 hdfs 而不是使用 put file 命令。如果您需要我详细说明,请告诉我
-
您将无法使用 filezilla 将文件放入 hdfs。根据您的解释和 cmets,我相信您将文件放在本地文件系统中,并在创建表时尝试指向 hdfs 中的文件。使用 filezilla 将文件放入本地文件系统后,使用
load data local inpath或使用命令hdfs dfs put /user/foobar.csv将文件放入 hdfs,然后创建表并使用load data inpath加载数据 -
您在 put 命令中提到的“/user/foobar.csv”路径。那是文件已经存在的位置还是文件需要去的目标路径?
-
@Prabhat Ratnala put 命令是缺失的部分!谢谢你。它对我有用。我能够将文件加载到我的配置单元表中