由非第一列分区

时间:2015-04-15 20:13:21

标签: hive hiveql database-partitioning

我有一个表,使用以下hiveQl-script创建:

CREATE EXTERNAL TABLE Logs 
(
    ip STRING,
    time STRING,
    query STRING,
    pageSize STRING,
    statusCode STRING,
    browser STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
   -- some regexps
)
STORED AS TEXTFILE
LOCATION '/path';

我需要按time字段创建分区。但是在我看到的所有例子中,分区只能通过第一个字段或首先开始的字段序列来创建。我也看到,如果我在PARTITIONED BY部分写下字段,我就不能在CREATE TABLE部分写出来。

我试图通过多种方式按时间创建分区,但总是要考虑不同的异常。

例如:

  

ParseException行11:20无法识别附近的输入')' ' ROW' ' FORMAT'在列类型

或者这个:

  

ParseException 16:0在' PARTITIONED'靠近')'

等等。

那么,在我的情况下,如何通过time字段创建分区?

1 个答案:

答案 0 :(得分:1)

hive中的分区列不是真正的列。它只是为hive提供了查找特定分区文件的位置。

因此,如果您有一个文件要根据此文件中的一列将文件存储到不同的分区中。没有任何无意识的方法可以执行此操作,您必须自己拆分输入文件并加载分割将文件放入不同的分区。(如果您不知道如何根据列拆分文件,请使用awk {print $0>>"filebase."$2;}

或者您可以先将输入加载到未分区的表中。然后使用查询将这些数据插入另一个分区表。

我希望这可以提供帮助。