Столбцы улья-новая строка

#hive #special-characters #hiveql

Вопрос:

Некоторые столбцы в улье содержат несколько строк значений, которые отображаются в виде новой строки

например

предварительный просмотр таблицы

Эмпид Имя Отдел Компания год месяц день
1234 ASD Финансы qqq нулевой нулевой нулевой
2015 6 3

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

 select year from tbl_name where year='2015'
 

в чем может быть причина этих многострочных значений и как выровнять эти значения в правильном столбце?

Ответ №1:

В зависимости от того, как хранится таблица, ее можно исправить или не использовать SQL.

Если таблица основана на текстовом файле (ХРАНИТСЯ В ВИДЕ ТЕКСТОВОГО ФАЙЛА или с использованием OpenCSVSerDe или JSON…), то строки, считываемые SerDe, используют новые строки в качестве разделителя, и если столбец содержит новую строку, он разбивается на новую строку на самом низком уровне.

Если хранилище таблиц имеет двоичный формат, такой как ORC, оно не хранится в виде строк, разделенных новой строкой. Значения с новыми строками считываются без разделения строк, но новые строки вызывают разделение строк на выходе, то же самое происходит, если формат хранения JSON и содержит комбинации косая черта n ( n ), такие комбинации интерпретируются как новые строки на выходе. Можно заменить новые строки пробелами или пустой строкой, используя regexp_replace :

 insert overwritre table tbl_name 
select
Empid, 
Empname, 
Dept, 
 regexp_replace(company, '\n',' ')  company, --replace newline with space
`year`, 
`month`, 
`day`
from tbl_name ;
 

Кроме того, если столбец содержит вкладки, его также лучше заменить пробелами или удалить их, так t как это приводит к смещению столбцов. Воспользуйся regexp_replace(col_name, '\t',' ')