... Я действительно думал, что это будет хорошо пройденный путь.Создание таблицы Hive - как получить имена столбцов из CSV-источника?
Я хочу создать инструкцию DDL в Hive (или SQL, если на то пошло), проверив первую запись в CSV-файле, который раскрывает (как это часто бывает) имена столбцов.
Я видел множество близких ответов на эту проблему, но не для многих, которые могут быть автоматизированы или воспроизведены в масштабе.
Я создал следующий код для обработки задачи, но я боюсь, что у него есть некоторые проблемы:
#!/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, но это, вероятно, изменится на этой неделе. Спасибо за выражение регулярного выражения, чтобы счистить имена столбцов. Это очень полезно и, вероятно, заслуживает того, чтобы быть опцией флага cmd-линии даже в мире после 0,133. – agentv