在刚创建的 table 上插入覆盖

INSERT OVERWRITE on just created table

我必须为客户复制一个流程。我从未与 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 的信息而言,针对外部 table 的 DROP TABLE IF EXISTS 语句只会删除 table 元数据,而不会删除 table 数据。但我想知道 INSERT OVERWRITE 语句是否删除了 table 中存储的先前条目,并仅插入指定位置

中包含的新行

另外,LOCATION 是如何管理的?我想从单个 .csv 文件创建 table。我可以写类似 LOCATION '/warehouse/develop/myfile.csv' 的东西吗?或者我只能提供一个 HDFS 目录作为位置?

你说得对,外部 table 的位置将保持原样。因此,通过 drop-create 语句,他们确保 table 在删除或创建之前不存在。 table 似乎本质上是动态的,因此这可能是 drop-create 的另一个原因。

请注意您使用的是 CREATE EXTERNAL TABLE IF NOT EXISTS,这意味着如果 table 存在,它将不会重新创建。 将使用 INSERT OVERWRITE.
清理和加载存储 现在,如果您想在 csv 文件之上创建一个 table,只需使用 LOCATION '/warehouse/develop/myfile。您不必在位置中使用 .csv。

INSERT OVERWRITE TABLE 删除 table 位置内的所有文件并移动新文件。当查询已经成功执行并在临时位置创建结果文件时,这种情况发生在最后,加载任务删除 table 位置中的所有文件并将文件从临时位置移动到 table地点。另请参阅此答案:

如果要在单个文件之上创建 table,请将其放在某个文件夹中并确保同一文件夹中没有其他文件,然后将该文件夹指定为创建 table DDL。您也可以使用 hdfs dfs -put 命令或使用 LOAD 命令或使用其他方式将该文件放入现有的 table 位置。这里的要点是 table 应该有自己的位置,无论该位置有多少文件 - 单个文件或多个文件,位置是一个文件夹(目录),而不是一个文件。即使可以在单个文件而不是文件夹之上创建 table,这也是不安全的,因为覆盖会创建另一个文件,而 table 的位置将指向不存在的文件。仔细阅读这个问题的答案: