2015-03-02 31 views
1

...我真的認爲這將是一個很好的旅行路徑。創建Hive表 - 如何從CSV源派生列名?

我想通過檢查CSV文件中的第一條記錄(通常是這種情況)列名來在Hive(或SQL)中創建DDL語句。

我已經看到了這個問題的各種近似解答,但沒有看到很多可以自動化或大規模複製的答案。

我創建了下面的代碼來處理的任務,但我擔心它有一些問題:

#!/usr/bin/python 

import sys 
import csv 

# get file name (and hence table name) from command line 
# exit with usage if no suitable argument 

if len(sys.argv) < 2: 
    sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename') 
ifile = sys.argv[1] 

# emit the standard invocation 
print 'CREATE EXTERNAL TABLE ' + ifile + ' (' 

with open(ifile + '.csv') as inputfile: 
    reader = csv.DictReader(inputfile) 
    for row in reader: 
     k = row.keys() 
     sprung = len(k) 
     latch = 0 
     for item in k: 
     latch += 1 
     dtype = '` STRING' if latch == sprung else '` STRING,' 
     print '`' + item.strip() + dtype 
     break 
    print ')\n' 

print "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','" 
print "LOCATION 'replacethisstringwith HDFS or S3 location'" 

首先,它只是數據類型都爲字符串。 (我想這是來自CSV,這是一個可原諒的罪行,當然也可以處理結果輸出以更準確地設置數據類型。)

其次,它不會清理不允許使用的字符的潛在列名在Hive表列名稱中。 (我很容易通過讀取一個數據集來讀取數據集,在這個數據集中列名通常有一個撇號作爲數據,這導致了一個混亂。)

第三個是數據位置被標記化。我想只需多一點編碼時間,它可以作爲參數在命令行中傳遞。

我的問題是 - 爲什麼我們需要這樣做?我錯過了什麼簡單的方法來做到這一點?

(BTW:沒有加分引用CSV SERDE - 我想這是隻有在蜂房14可我們很多人都沒有沿着那麼遠,我們的生產系統)

回答

1

關於第一個問題(所有列都被鍵入爲字符串),但實際上這是當前的行爲,即使該表正在由CSVSerde或RegexSerDe進行處理。根據用例的具體情況是否可以容忍額外的運行時延遲,一種可能的方法是根據外部表定義視圖,該表在查詢時動態重新列出列,並針對視圖而不是外部表直接進行查詢。喜歡的東西:

CREATE VIEW VIEW my_view (
    CAST(col1 AS INT) AS col1, 
    CAST(col2 AS STRING) AS col2, 
    CAST(col3 AS INT) as col3, 
    ... 
    ... 
) AS SELECT * FROM my_external_table; 

對於第二個問題(消毒列名),我推斷你的蜂巢安裝0.12或更早版本(0.13支持在列名的Unicode字符)。如果導入re正則表達式模塊,您可以執行擦洗你的Python的東西,如下列:

for item in k: 
    ... 
    print '`' + re.sub(r'\W', '', item.strip()) + dtype 

這應該擺脫任何非alphernumeric /下劃線,這是前期0.13的預期爲Hive列名稱。順便說一下,如果您以這種方式清理列名稱,我認爲您不再需要周圍的反引號。

至於第三個問題(外部表格位置),我認爲指定位置作爲命令行參數是一個合理的方法。一種替代方案可能是在數據文件中添加另一個「元數據」,以便以某種方式指定位置,但如果您已經坐在大量數據文件上,那將會很痛苦 - 我個人更喜歡命令行方法。

+0

是的,我(目前)正在開發0.13版之前的版本,但本週可能會有所變化。 感謝您使用正則表達式來清理列名。這很有幫助,即使在0.13後的世界裏,它也可能成爲一個CMD標誌選項。 – agentv 2015-03-02 16:08:06

1

Kite SDK具有使用頭記錄中的名稱和前幾個數據記錄中的類型來推斷CSV模式的功能,然後從該模式創建Hive表。您也可以使用它將CSV數據導入到該表中。

+0

謝謝。風箏看起來不錯。似乎目前僅限於Java,但這並不是虛弱。有一件事。我使用CDH查看了所有的文件。是這種情況,還是僅僅是一種自然推定?我正在使用Hive-as-a-Service產品(Qubole),也許這會整合。我無法確定。沒有我能看到的「系統要求」聲明。 – agentv 2015-03-02 16:00:56

+1

我不太確定Qubole,但Kite對CDH和Apache Hadoop都有依賴性,所以這是一個很好的機會。 http://kitesdk.org/docs/1.0.0/dependencies/ – 2015-03-02 16:09:08

+0

謝謝,這確實提供了有助於深入瞭解風箏如何使用以及它可能有用的地方。 – agentv 2015-03-04 20:10:49