簡體   English   中英

Apache Hive如何識別分區是哪一列

[英]Apache Hive how to identify which column is the partition

我有一組日志文件,創建了一個Hive表,現在我想基於col對表進行分區,我不了解&尚未看到的示例是如何為分區指定列,如何指定col / field例如 這是日志中的一行

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

table struc是CREATE TABLE日志(開始時間STRING,線程STRING,會話STRING,方法STRING,targeturl STRING,注冊表字符串,ipaddress STRING,詳細信息STRING)。行格式由'〜'終止的限定字段; 現在,如果我想將6the col即“ registry”作為日志的分區,我將如何編寫分區語句。 通常,如果我的行(行)帶有cols c1,c2,..... c10,如何在分區中指定col ci? 謝謝

您首先要做的是在創建表時明確告訴您希望將哪些列作為分區。 使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上閱讀有關動態分區的更多信息。

此外,hive對於已分區的外部表存在問題。 假設在表格形式的子目錄(例如dt = 21012-04-01和其他類似目錄)中設置數據之后,創建表聲明為外部表。 除了您的數據不會在選擇中顯示之外,其他所有顯示都很好。

彈性地圖減少功能添加了解決此問題的功能

ALTER TABLE log RECOVER PARTITIONS;

我添加此信息是因為花了我一段時間才找出為什么我的數據不存在的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM