2015-03-02 2 views
1

... Я действительно думал, что это будет хорошо пройденный путь.Создание таблицы 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. Многие из нас не так далеко вперед еще с нашими производственными системами)

ответ

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 поддерживает любого Юникод символа в имени столбца). Если импортировать модуль re регулярных выражений, вы можете выполнить, что очистка в вашем Python с чем-то вроде следующее:

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

Это должно избавиться от любых не alphernumeric/подчеркивания символов, который был предварительно 0.13 ожидания для Имена столбцов улья. Кстати, я не думаю, что вам нужны окружающие задники, если вы санируете имя столбца таким образом.

Что касается третьей проблемы (расположение внешней таблицы), я считаю, что определение местоположения в качестве параметра командной строки является разумным подходом. Один из альтернатив может заключаться в том, чтобы добавить еще один «метару» в ваш файл данных, который каким-то образом определяет местоположение, но это будет больно, если вы уже сидите на тонне файлов данных - лично я предпочитаю подход командной строки.

+0

Да, я (на данный момент) работает над выпуском до 0,13, но это, вероятно, изменится на этой неделе. Спасибо за выражение регулярного выражения, чтобы счистить имена столбцов. Это очень полезно и, вероятно, заслуживает того, чтобы быть опцией флага cmd-линии даже в мире после 0,133. – agentv

1

Kite SDK имеет функциональность, чтобы выводить схему CSV с именами из записи заголовка и типами первых записей данных, а затем создавать таблицу Hive из этой схемы. Вы также можете использовать его для импорта CSV-данных в эту таблицу.

+0

Спасибо. Кайт выглядит хорошо. Кажется, что в настоящее время он ограничен Java, но это не изнурительно. Одна вещь. Весь документ, который я рассматривал, предполагает использование CDH. Так ли это, или это просто естественная презумпция? Я работаю с предложением Hive-as-a-Service (Qubole), и, возможно, это будет интегрировано. Я не могу точно сказать. Я не вижу инструкции «системных требований». – agentv

+1

Я не уверен в Qubole, но у Kite есть зависимости как для CDH, так и для Apache Hadoop вообще, так что есть хорошие шансы. http://kitesdk.org/docs/1.0.0/dependencies/ –

+0

Спасибо, это дает полезное представление о том, как используется Kite, и где это может быть полезно. – agentv

Смежные вопросы