2013-10-06 7 views
2

У меня есть файл, столбцы которого ограничены символом^A и строками, разделенными символом новой строки \ n \.Ограничитель HIVE n^M issue

Я первый загрузив его на HDFS, а затем создать таблицу в улей, используя команду:

CREATE EXTERNAL TABLE 
IF NOT EXISTS 
html_sample 
(ts string, 
    url string, 
    html string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
LINES TERMINATED BY '\n' 
LOCATION '/tmp/directoryname/'; 

Однако, когда я делаю отборное заявление для этой таблицы. Это оказалось беспорядком.

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

ts    url     html 
10082013  http://url.com/01  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 
10092013  http://url.com/02  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 

Затем я вернулся в текстовый файл и обнаружил, существует несколько^символов M в файле, что делает HIVE лечить, что^М как символ новой строки.

Когда я впервые создал файл, я намеренно удалил весь новый символ строки из html, чтобы гарантировать, что каждая запись является одной строкой. Тем не менее, я просто не могу понять, как на самом деле HIVE может относиться к M как символ новой линии. Как я могу обойти это без изменения моего файла.

(я знаю, что это могло бы быть возможно сделать глобальную замену в VI или СЭД ... но это просто не имеет смысла, что мне, как мог Hive лакомство^М как \ п)

ответ

5

^M - это способ, которым Vim отображает окончание строк Windows. Вот больше об этом: What does ^M character mean in Vim?

И улей, в свою очередь использует TextInputFormat, который происходит, чтобы рассматривать его как действительный конец строки.

В зависимости от версий Hadoop и Hive, которые вы используете, могут быть разные способы преодоления этого (от изменения свойства в конфигурации до пользовательской реализации InputFormat).

Просто найдите способ явно указать разделитель.

И да, ЛИНИИ, ПРЕРЫВАННЫЕ '\ n', не делают то, на что похоже. Я использую Hive 0.11, и только возможное значение на самом деле '\ n' для него, но это не относится к TextInputFormat

+2

И вот билет от Hadoop, который решает проблему с TextInputFormat. Возможно, это будет полезно для вас при поиске конкретного решения https://issues.apache.org/jira/browse/MAPREDUCE-2254 – ybodnar

+1

спасибо за ответ, я обошел его, используя sed -e 's/^ M // g ', чтобы удалить все существующие^M в моем файле и, похоже, сработает. Но изменить конфигурационный файл наверняка будет долгосрочное решение. –

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