【问题标题】:Apache Hive how to identify which column is the partitionApache Hive 如何识别哪一列是分区
【发布时间】:2012-09-03 11:44:25
【问题描述】:

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

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

表结构是 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 即 'registry' 成为日志的分区,我将如何编写分区语句。 一般来说,如果我有一行(行)与 cols c1,c2,..... c10 如何在分区中指定col ci? 谢谢

【问题讨论】:

    标签: hadoop hive hadoop-partitioning


    【解决方案1】:

    您首先要做的是在创建表时明确告诉您希望哪些列成为分区。将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
      

    您可以阅读更多关于动态分区的信息on the official Apache wiki

    【讨论】:

    • 我喜欢你的解决方案,会这样做,我理解你的解决方案,谢谢!。但只是为了理解,如果我不创建 raw_log,如果我有一行具有 cols c1、c2、c3...c10 的数据(即 sep by ex.~),如何告诉 hive 一个人如何指定 col c3还是 c5 作为分区 col?
    • 您在动态分区查询中执行此操作。在INSERT OVERWRITE TABLE log PARTITION(registry) 中,您指定在分区日志表中您希望注册表用作分区列。如果您有多个分区级别,则改为 PARTITION(c3, c5)。
    • @Integration 抱歉耽搁了,是的,Mark 说的完全正确,您在 PARTITION 语句中指定了您的分区。
    【解决方案2】:

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

    Elastic map reduce 添加了一个功能来解决这个问题

    ALTER TABLE log RECOVER PARTITIONS;
    

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

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多