【问题标题】:How to store multiple files under the same directory in hive?如何在hive的同一目录下存储多个文件?
【发布时间】:2019-11-12 16:57:51
【问题描述】:

我正在使用 Hive 处理我的 CSV 文件。我已将 CSV 文件存储在 HDFS 中,并想从这些文件中创建表。

我使用以下命令:

create external table if not exists csv_table (dummy STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/hive'
TBLPROPERTIES ("skip.header.line.count"="1");

LOAD DATA INPATH '/CsvData/csv_table.csv' OVERWRITE INTO TABLE csv_table;

所以/CsvData下的文件将被移动到/user/hive。有道理。

但是如果我想创建另一个表呢?

create external table if not exists csv_table2 (dummy STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/hive'
TBLPROPERTIES ("skip.header.line.count"="1");

LOAD DATA INPATH '/CsvData/csv_table2.csv' OVERWRITE INTO TABLE csv_table2;

它会引发一个异常,抱怨目录不为空。

ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask. Directory hdfs://localhost:9000/user/hive could not be cleaned up.

所以我很难理解,是不是意味着我只能存储一个文件理解一个目录?要存储多个文件,我必须为每个文件创建一个目录?

是否可以将所有文件存储在一起?

【问题讨论】:

    标签: hadoop hive hdfs create-table hiveddl


    【解决方案1】:

    创建表语句不会引发抱怨目录不为空的异常,因为在现有目录之上创建表是很正常的情况。

    您可以根据需要在目录中存储任意数量的文件。并且所有这些都可以通过文件夹顶部的表格访问。

    表位置是目录,而不是文件。如果您需要创建新表并保持其文件不与其他表混合,则创建单独的文件夹。

    请阅读此答案以获得清晰的理解:https://stackoverflow.com/a/54038932/2700344

    【讨论】:

    • 嗯,是的,它不会在创建时抛出,而是在加载时抛出。我的坏,修复。请查看我的更新。
    • 顺便说一句,这可能是因为我正在创建外部表而不是托管表。如您所见,失败的任务正在移动,这意味着配置单元正在尝试将文件移动到目标。但我必须创建外部的,因为我不想将数据与架构链接。
    • 创建表不移动文件。加载数据 - 移动。而你使用 OVERWRITE。如果使用了 OVERWRITE 关键字,则目标表(或分区)的内容将被删除并替换为 filepath 引用的文件;否则文件路径引用的文件将被添加到表中
    • 感谢您的澄清。我明白你所说的。但是还是没有解决加载数据到非空目录会报错的问题。
    • @Sraw 为什么要在同一个文件夹的顶部创建两个表?此类表将共享相同的数据,与外部表或托管表无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多