【问题标题】:Hive columns-newlineHive 列-换行符
【发布时间】:2021-07-04 18:36:33
【问题描述】:
hive 中的某些列具有多行值,这些值以换行符形式出现
例如
| Empid |
Empname |
Dept |
company |
year |
month |
day |
| 1234 |
ASD |
Finance |
qqq |
null |
null |
null |
| 2015 |
6 |
3 |
|
|
|
|
但是当我用年份查询表格时,它给出了正确的答案
select year from tbl_name where year='2015'
这些多行值的原因可能是什么以及如何将这些值对齐到适当的列中?
【问题讨论】:
标签:
hive
special-characters
hiveql
【解决方案1】:
根据表的存储方式,可以修复或不使用 SQL。
如果表基于文本文件(存储为 TEXTFILE 或使用 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',' ')