我希望能从Hadoop上现有的文件创建一个带有分区的表格。需要进行分区的日期值已经在文件中存在,但是日期值所在列的位置不是最后。它位于中间。我应该如何创建相应的表格?
以下是样例:
以下是样例:
1 John 2012-01-10 Miller
2 Austin 2012-02-22 Powers
让我们举个例子:您想要创建一个分区的 Hive 表,其中包含三列 (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-01或dt=2012-02-22。在这些目录中将是您选择存储格式的实际数据。分区列不会与此数据一起存储;它是从包含您的数据的分区目录解析出来的虚拟列。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上为你创建适当的目录结构。