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

Posted

技术标签:

【中文标题】尝试将 hdfs 中的 csv 文件加载到配置单元表时未选择行【英文标题】:No rows selected when trying to load csv file in hdfs to a hive table 【发布时间】: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 &lt;file&gt; 命令来上传文件到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 命令是缺失的部分!谢谢你。它对我有用。我能够将文件加载到我的配置单元表中 【参考方案1】:

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

您应该创建一个文本文件格式的临时表。

使用命令将数据加载到其中。 蜂巢>在路径中加载数据..... 否则你可以在创建表本身时使用位置参数。

现在创建一个 hive 表作为您所需的文件格式(RC、ORC、parquet 等)。

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

hive> 将覆盖插入表 foobar 作为 select * from temptbl;

你会得到orc文件格式的表格。

第二个问题是,如果您使用 LOAD DATA 命令将数据加载到表中,则文件中的数据将变为空,并且将在默认位置(/user/hive/warehouse/)创建新目录表名和数据将移动到该文件中。所以检查那个位置你会看到数据。

【讨论】:

以上是关于尝试将 hdfs 中的 csv 文件加载到配置单元表时未选择行的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?

如何在将 csv 文件加载到配置单元表时跳过页脚/拖车记录

如何使用 Spark 数据帧将 csv 数据加载到配置单元中?

Hive:将hdfs中的gziped CSV作为只读加载到表中

从 HDFS 中的数据文件夹在配置单元中创建表 - 删除重复的行

数据未从 csv 文件正确加载到配置单元表