2012-04-23 71 views
2

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

下面是示例:

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

回答

7

让我们举个例子:你想有一个分区蜂巢表有三列(id INT, fname STRING, dt STRING, lname STRING)其中idfnamelname是存储整数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重写命令,说了),去检查HDFS位置(在/ usr /蜂巢/仓储/ 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