在刚创建的 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 的位置将指向不存在的文件。仔细阅读这个问题的答案:
我必须为客户复制一个流程。我从未与 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 的位置将指向不存在的文件。仔细阅读这个问题的答案: