Hive表分区,中间有列

div*_*gon 2 hadoop hive

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

这是样本:

1  John    2012-01-10 Miller  
2  Austin  2012-02-22 Powers
Run Code Online (Sandbox Code Playgroud)

小智 9

让我们举个例子:你想有一个分区蜂巢表有三列(id INT, fname STRING, dt STRING, lname STRING),其中id,fname,lname是存储整数ID列,串名字和一个字符串姓氏respecitvely和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';
Run Code Online (Sandbox Code Playgroud)

当您将数据插入此表时(例如,通过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';
Run Code Online (Sandbox Code Playgroud)

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

INSERT OVERWRITE TABLE my_table PARTITION (dt)
SELECT id, fname, lname, dt FROM my_table_staging;
Run Code Online (Sandbox Code Playgroud)

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

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