Hadoop 尝试将hdfs中的csv文件加载到配置单元表时未选择任何行

Hadoop 尝试将hdfs中的csv文件加载到配置单元表时未选择任何行,hadoop,hive,hdfs,Hadoop,Hive,Hdfs,我在hdfs中有一个名为test.csv的csv文件。文件是通过filezilla放在那里的。当我使用用于将文件放入hdfs的相同帐户凭据通过putty登录到Edge node时,我能够查看文件的路径和内容。然后,我连接到配置单元并尝试创建一个外部表,使用以下语句指定我的csv文件在hdfs中的位置: CREATE EXTERNAL TABLE(col1 string, col2 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STOR

我在hdfs中有一个名为
test.csv
的csv文件。文件是通过filezilla放在那里的。当我使用用于将文件放入hdfs的相同帐户凭据通过putty登录到Edge node时,我能够查看文件的路径和内容。然后,我连接到配置单元并尝试创建一个外部表,使用以下语句指定我的csv文件在hdfs中的位置:

CREATE EXTERNAL TABLE(col1 string, col2 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS ORC LOCATION '/file path'
当我执行这个命令时,它正在配置单元上创建一个外部表,但是正在创建的表是空的,只显示我在create语句中已经提到的列。我的问题是,我是否在上面的create语句中的location参数中指定了正确的路径?当我将csv文件放入hdfs时,我尝试使用filezilla上显示的路径,格式为
home/servername/username/directory/subdirectory/file
但这会返回一个错误,说明在上述路径中指定用户名的用户在文件路径上没有所有权限

注意:我检查了文件及其所在目录的权限,用户拥有所有权限(读、写和执行)

然后,我尝试将路径更改为
user/username/directory/subdirectory/file
格式,当我这样做时,我能够创建外部表,但是该表是空的,并且不会加载创建它的csv文件中的所有数据

我还尝试了如下创建一个内部表的替代方法,然后使用
LOAD DATA INPATH
命令。但这也失败了,因为我得到一个错误,说“在指定的路径上没有文件存在”

CREATE TABLE foobar(键字符串,stats映射)
行格式分隔
以“,”结尾的字段
以“|”结尾的集合项目
以“:”结尾的映射键;
将路径“/tmp/foobar.csv”中的数据加载到表foobar中;

首先,您不能将csv文件直接加载到配置单元表中,该配置单元表在创建时使用orc文件格式指定。Orc是一种以优化方式存储数据的压缩技术。所以,您可以按照以下步骤将数据加载到orc格式表中

  • 您应该以文本文件格式创建临时表

  • 使用命令将数据加载到其中。 配置单元>加载路径中的数据。。。。。 或者,您可以在创建表本身时使用位置参数

  • 现在创建一个配置单元表作为您所需的文件格式(RC、ORC、拼花地板等)

    -现在使用下面的命令将数据加载到其中

    配置单元>将覆盖插入到表foobar中,作为select*from bl

  • 您将获得orc文件格式的表


在第二个问题中,如果使用Load data命令将数据加载到表中,则文件中的数据将变为空,并且将在默认位置(/user/hive/warehouse/)中创建新目录,并使用表名将数据移动到该文件中。因此,在该位置进行检查,您将看到数据

这里有点困惑,您不是在使用
hadoop fs-put
命令将文件上载到HDFS吗?。不知道你说的“文件是通过filezilla放在那里的”是什么意思。您需要在HDFS上有这个文件,并且可以使用
hadoop fs-ls检查该文件hdfs://hdfshostname/path/to/the/file
我对此完全陌生,请原谅我没有使用正确的术语,但我的意思是,我的csv文件已经在hdfs上,并且我无法将该文件加载到hive。这是我的主要问题。当我提到file zilla时,我只是在谈论一个FTP应用程序,我使用它将文件放入hdfs中,而不是使用put file命令。请让我知道,如果您需要我详细说明,您将无法使用filezilla将您的文件放入hdfs。根据您的解释和评论,我相信您正在将文件放在本地文件系统中,并试图在创建表时指向hdfs中的文件。使用filezilla将文件放入本地文件系统后,请使用
load data local inpath
或使用命令
hdfs dfs put/user/foobar.csv
将文件放入hdfs,然后使用put命令中提到的“/user/foobar.csv”路径创建表并加载数据。这是文件已经存在的位置还是文件需要到达的目标路径?@Prabhat Ratnala put命令是丢失的部分!非常感谢。这对我有用。我能够将文件加载到我的配置单元表中
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;