2013-04-20 2 views
3

У меня есть следующая проблема ... Я работаю с Hive и хочу добавить файл с несколькими (разными) строками строк. В них содержатся поля с фиксированным размером, такие как:Разделительные поля из строки в Hive

A20130420bcd 34 fgh 

где поля имеют длину 1,8,6,4,3. Отдельно он будет выглядеть следующим образом:

«А, 20130420, BCD, FGH»

Есть ли возможность читать строки и отсортировать его в поле помимо получения его в качестве подстроки для каждого поля, как

substring(col_value,1,1) Field1 

etc? Я бы предположил, что резка уже прочитанной части строки повысит производительность, но я мог бы подумать о любом способе сделать это с заданными функциями here.

Во-вторых, как указано ранее, существуют разные типы строк, упорядоченные и идентифицированные первым символом. Теперь просто проверяйте их с помощью WHERE-Statement, но это ужасно, поскольку он проходит через весь файл, чтобы найти только первая строка. Есть ли способ прочитать определенные строки по их числу? Если я знаю, что первая строка будет определенного типа, можете прочитать ее напрямую?

право это выглядит следующим образом:

insert overwrite table TEST 
SELECT 
substring(col_value,1,1) field1, 
... 
substring(col_value,10,3) field 5 
from temp_data WHERE substring(col_value,1,1) = 'A'; 

какие-либо идеи по этому поводу?

Я хотел бы услышать некоторые идеи =)

+0

Улей 0.10.0.21, кто-нибудь? – Maltram

+0

Должен быть какой-то способ обратиться к одной строке по индексу рядом с проверкой определенного поля? – Maltram

+0

Вы беспокоитесь о последствиях производительности нескольких операций подстроки и полного сканирования таблиц? Это Мыс, о котором мы говорим, не так ли? Если производительность является проблемой, просто добавьте больше узлов в ваш кластер. –

ответ

1

Вы должны написать вашу родовой-UDF парсер, который выведет структуру или карты или что-то необходимо. вы можете обратиться к UDF that output multi-values.

, то вы можете написать

insert overwrite table output 
select parsed.first, parsed.second 
from (
    select parse(taget) 
    from input 
) parsed 
where first='X'; 

О втором вопросе, вам может понадобиться, чтобы проверить «объяснить» команду улей, чтобы увидеть, если улей сделать фильтр нажимной вниз для вас. (Только посмотрите, сколько на карте уменьшить его . дубли, теоретически она должна быть одна картой, в зависимости от версии 1.hive, 2.Output формата таблица )

В общем смысле, поэтому база данных популярны - принять во внимание оптимизации для вас.

+1

спасибо, я заглянул в него, и он отлично работал. Как вы упомянули, разница в производительности не такая заметная, поскольку она сама по себе оптимизирует. – Maltram

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