我必须为一个客户复制一个过程。我从未与Hive合作过,所以我正在努力了解他们在其他情况下在做什么。
我试图理解的Hive脚本是这样的:
DROP TABLE IF EXISTS distribution.030601_TI11;
CREATE EXTERNAL TABLE IF NOT EXISTS distribution.030601_TI11(
mygroup STRING, year STRING, type1 STRING, type2 STRING,
type3 STRING, myvalue INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS TEXTFILE LOCATION '/warehouse/distribution/030601_TI11';
INSERT OVERWRITE TABLE distribution.030601_TI11
SELECT *
FROM develop.030601_TI11;
他们在干什么?
就我所读到的关于Hive的内容而言,外部表上的DROP TABLE IF EXISTS
语句只会删除表元数据,而不会删除表数据。
另外,如何管理LOCATION
?我想从一个.csv
文件创建表。我可以写类似LOCATION '/warehouse/develop/myfile.csv'
的内容吗?或者我只能提供HDFS目录作为位置?
2条答案
按热度按时间fkvaft9z1#
INSERT OVERWRITE TABLE
删除表位置中的所有文件并移动新文件。这发生在查询已成功执行并在临时位置中创建结果文件的最后,在加载任务删除表位置中的所有文件并将文件从临时位置移动到表位置之后。另请参阅以下答案:https://stackoverflow.com/a/63378038/2700344如果你想在一个文件上创建一个表,把它放在某个文件夹中,确保在同一个文件夹中没有其他文件,并在创建表DDL中指定该文件夹作为一个位置。你也可以使用
hdfs dfs -put
命令或LOAD命令或其他方法把该文件放在现有的表位置。这里的要点是,表应该有自己的位置。无论位置中有多少个文件-单个文件或多个文件,位置是文件夹(目录),而不是文件。即使可以在单个文件(而不是文件夹)上创建表,也是不安全的,因为覆盖可能会创建其他文件,并且表的位置将指向不存在的文件。请仔细阅读此问题的答案:How to point to a single file with external tablerhfm7lfc2#
你是对的,外部表的位置将保持原样。因此,通过drop-create语句,他们确保在删除或创建表之前该表不存在。而且该表本质上似乎是动态的,因此这可能是删除-创建的另一个原因。
请注意,您使用的是
CREATE EXTERNAL TABLE IF NOT EXISTS
,这意味着如果表存在,它将不会重新创建。存储将使用INSERT OVERWRITE
进行清理和加载。现在,如果你想在csv文件上创建一个表,只需使用
LOCATION '/warehouse/develop/myfile
。你不必在location中使用.csv。