我正在使用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.
所以我很难理解,是否意味着我只能存储一个文件就可以理解一个目录?要存储多个文件,我必须为每个文件创建一个目录?
是否可以将所有文件存储在一起?
答案 0 :(得分:1)
创建表语句不会引发异常,抱怨该目录不为空,因为在现有目录之上创建表时这是很正常的情况。
您可以根据需要在目录中存储尽可能多的文件。文件夹顶部的表将可以访问所有这些文件。
表位置是目录,而不是文件。如果您需要创建新表并使其文件不与其他表混合在一起,请创建单独的文件夹。
也请阅读此答案以明确理解:https://stackoverflow.com/a/54038932/2700344