#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',' ')