3

我想用 Hadoop 上现有文件的分区创建一个表。我需要分区的日期值在文件中可用,但日期值列位置不是最后一个。它在中间。我怎样才能创建相同的表?

这是示例:

1  John    2012-01-10 Miller  
2  Austin  2012-02-22 Powers
4

1 回答 1

11

举个例子:你想要一个分区的配置单元表,其中包含三个列(id INT, fname STRING, dt STRING, lname STRING),其中id, fname,lname是分别存储整数 id、字符串名字和字符串姓氏的列,dt 是字符串类型的分区列,其中包含 yyyy 中的日期-MM-dd 格式。要创建这样的表,您将发出如下命令:

CREATE EXTERNAL TABLE my_table (id INT, fname STRING, lname STRING)
PARTITIONED BY (dt STRING)
LOCATION '/usr/hive/warehouse/my_table';

当您将数据插入此表(例如通过 INSERT OVERWRITE 命令)并检查 HDFS 位置(/usr/hive/warehouse/my_table)时,您会发现数据存储在目录中;每个分区一个目录。目录的名称类似于dt=2012-01-01dt=2012-02-22。在这些目录中将是您选择存储的任何格式的实际数据。分区列与此数据一起存储;它是从您的数据所在的分区目录中破译的虚拟列。

现在让我们来回答你的问题。由于分区列是虚拟列,因此您不能将分区的 Hive 表按原样放在数据之上(无论您的待分区列是在文件中间还是在文件末尾)。您需要在 HDFS 中存在适当的目录结构才能进行分区。您可能希望创建一个未分区的临时表。

CREATE EXTERNAL TABLE my_table_staging (id INT, fname STRING, dt STRING, lname STRING)
LOCATION '/usr/hive/warehouse/my_table_staging';

然后使用此临时表作为源,使用动态分区填充分区表。为此,您可以使用如下命令:

INSERT OVERWRITE TABLE my_table PARTITION (dt)
SELECT id, fname, lname, dt FROM my_table_staging;

此命令将从您的暂存表中读取数据并将其插入到分区表中,从而在 HDFS 上为您创建适当的目录结构。

参考: - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL - https://cwiki.apache.org/Hive/dynamicpartitions.html

于 2012-04-25T00:16:17.937 回答