Apache Hive如何识别哪个列是分区

时间:2012-04-20 17:33:54

标签: hadoop hive hadoop-partitioning

我有一组日志文件,创建了一个Hive表,现在我想根据一个我不理解的字符对表进行分区&还没有看到的例子是如何为分区指定列如何指定col / field 防爆。这是日志中的行

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

表格结构是 CREATE TABLE日志(开始时间STRING,线程STRING,会话STRING,方法STRING,targeturl STRING,注册表字符串,ipaddress STRING,详细信息STRING)行格式删除字段由'〜'终止; 现在,如果我想要6个col,即'注册表'作为日志的分区,我将如何编写分区语句。 一般情况下,如果我有一行(行)cols c1,c2,..... c10 如何在分区中指定col ci? 感谢

2 个答案:

答案 0 :(得分: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
    
  3. 您可以阅读有关动态分区on the official Apache wiki

    的更多信息

答案 1 :(得分:0)

此外,hive遇到了分区外部表的问题。假设您在表单的子目录中设置数据(例如,dt = 21012-04-01和其他类似目录)后创建表,将其声明为外部表。除了您的数据不会在选择中显示外,所有内容都显示正常。

弹性贴图缩小添加了一个解决此问题的功能

ALTER TABLE log RECOVER PARTITIONS;

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