...我真的認爲這將是一個很好的旅行路徑。創建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可我們很多人都沒有沿着那麼遠,我們的生產系統)
是的,我(目前)正在開發0.13版之前的版本,但本週可能會有所變化。 感謝您使用正則表達式來清理列名。這很有幫助,即使在0.13後的世界裏,它也可能成爲一個CMD標誌選項。 – agentv 2015-03-02 16:08:06