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

标签: hadoop hive hdfs


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多