2016-07-29 28 views
1

我有一個用例,我需要使用Hive實現基於SQL的數據倉庫活動。基於Hive的數據倉庫任務 - 添加序列號到記錄

該軟件會生成一堆csv文件。當它轉換爲SQL表時,會爲每個csv文件分配一個名爲session的唯一標識並將其加載到SQL表中。比方說,我在csv文件中有3列。我將在SQL表中有四列,其中第一列代表會話。這意味着存儲在第一個csv文件中的值將被寫入SQL表中,其中sessios id爲'1',第二個csv文件中的值將被附加到會話標識爲'2'的SQL表中,依此類推。

在蜂房,

我HDFS中存儲的目錄這些CSV文件,並希望創建一個配置單元表表示會話ID的附加列。我不知道我該怎麼做。任何幫助或線索將不勝感激。下面

+0

您是否可以創建沒有額外列的表?計算機如何知道id應該是什麼?你有沒有考慮過在讀取文件時使用他的標記文件標記(所以不要動態地添加一個標識符,而是將文件的名稱作爲列添加) –

+0

這是一個很好的建議,即添加文件的名稱而不是ID。但是,當我編寫我的HQL查詢時,我從多個表中選取了幾個值。在這種情況下,我看到彈出一個錯誤,即在多個表中找到了INPUT__FILE__NAME。任何解決方法在這裏? – Bala

+0

我修好了。這在我的查詢中是一個簡單的錯誤。我在查詢中錯過了DISTINCT。謝謝。我仍然需要將會話存儲在一個單獨的表格中,以跟蹤哪個會話正在處理,哪個不會。我會在單獨的桌子的幫助下做到這一點。 – Bala

回答

0

嘗試方法:

使用隨機會話ID:

create external table staging (a string, b string, c string) location 'xyz';


    • 源數據集的頂部創建外部表指定一個唯一的ID每一行:

    insert into table destination as select reflect("java.util.UUID", "randomUUID") AS session_id, s.* from staging;

    使用序列號作爲會議ID:

create external table staging (a string, b string, c string) location 'xyz';

  • 源數據集的頂部創建外部表

    • 第一次數據負載:

    CREATE TABLE IF NOT EXISTS max_session_id (session_id int);

    • 附加一個序列ID確定爲每個記錄:

    insert into table destination select cast(coalesce(t.session_id,0) + row_number() over() as INT) as session_id, t1.* from max_session_id t join destination t1 on 1=1;

    • 保持在單獨的表中最大會話ID:

    DROP TABLE IF EXISTS tmp_max_session_id; CREATE TABLE tmp_max_session_id AS SELECT COALESCE(MAX(session_id), 0) AS session_id FROM destination;

    INSERT OVERWRITE TABLE max_session_id SELECT * FROM tmp_max_session_id; 
    
    如果你想標記每個文件相同的會話ID,然後每個文件添加爲一個分區

    ,你可以存儲反映(「java.util.UUID中」,「randomUUID」)或max_session_id在單獨的表中,而添加分區時使用新生成的session_id作爲分區ID。

+0

非常感謝您的建議。對我來說這是一個很好的學習。雖然,沒有必要爲每個記錄分配一個唯一的ID,但需要處理每個文件的序列號。而不是INPUT__FILE__NAME,我喜歡看到一個整數。儘管如此,我會爲您的未來需求提供投入。 – Bala

+0

您可以使用第二種方法爲每個文件生成序列標識並將其作爲分區添加到您的表中。 –