0

我有一组日志文件,创建了一个 Hive 表,现在我想根据 col 对表进行分区我不明白并且没有看到示例是如何为分区指定列如何指定 col/字段前任。这是日志中的一行

2012-04-11 16:49:10,629 ~ [http-7001-11] ~DE1F6F6667913022AE2620D1228817D6 ~ END ~ /admin/bp/setup/newedit/ok ~ pt ~ 219 ~

table struc 是 CREATE TABLE log (starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, registry string, ipaddress STRING, details STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'; 现在,如果我希望 6the col ie 'registry'成为日志的分区,我将如何编写分区语句。 一般来说,如果我有一行(行)与 cols c1,c2,..... c10 如何在分区中指定 col ci? 谢谢

4

2 回答 2

0

此外,hive 在分区的外部表方面存在问题。假设您在表单的子目录(例如 dt=21012-04-01 和其他类似目录)中设置数据后,创建了将其声明为外部的表。一切看起来都很好,只是您的数据不会显示在选择中。

Elastic map reduce 添加了一个特性来解决这个问题

ALTER TABLE log RECOVER PARTITIONS;

我正在添加此信息,因为我花了一段时间才找出我的数据不存在的原因。

于 2012-04-21T06:22:49.220 回答
0

您首先要做的是在创建表时明确告诉您希望哪些列成为分区。要制作registry分区:

CREATE TABLE log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, ipaddress STRING, details STRING)
PARTITIONED BY (registry STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'

您可以添加任意数量的分区,每个分区将是一个嵌套的子文件夹,以及您在PARTITIONED BY事务中声明分区的顺序:第一个将是顶级分区,第二个将是 1降级,... 一个例子:

|--- mytable
      `---- mypartition1=x
                   `-------- mypartition2=x
                                     `------- ...

我会做的是:

  1. 创建一个指向日志目录位置的外部表,根本没有分区(只包含原始日志文件),它将raw_log用您的所有数据填充表,没有分区(还):

    CREATE EXTERNAL TABLE raw_log(starttime STRING, thread STRING, session STRING, method STRING, targeturl STRING, registry STRING, ipaddress STRING, details STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
    LOCATION '/path/to/your/log/dir'
    
  2. 使用 Hive 的动态分区功能读取raw_log和插入log

    FROM raw_log raw
    INSERT OVERWRITE TABLE log PARTITION(registry)
           SELECT raw.starttime, raw.thread, raw.session, raw.method, raw.targeturl, raw.ipaddress, raw.details
    

您可以在官方 Apache wiki 上阅读有关动态分区的更多信息

于 2012-04-21T00:50:50.297 回答