Hive表中间有列的分区

3
我希望能从Hadoop上现有的文件创建一个带有分区的表格。需要进行分区的日期值已经在文件中存在,但是日期值所在列的位置不是最后。它位于中间。我应该如何创建相应的表格?
以下是样例:
1  John    2012-01-10 Miller  
2  Austin  2012-02-22 Powers
1个回答

12

让我们举个例子:您想要创建一个分区的 Hive 表,其中包含三列 (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 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 INTO partitioned_table PARTITION(partition_column) 
SELECT column1, column2, ... partition_column 
FROM staging_table;
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

在相同的情况下,如何通过load data命令将数据加载到静态分区表中。 - EXODIA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接