Hive 列-换行符
Posted
技术标签:
【中文标题】Hive 列-换行符【英文标题】:Hive columns-newline 【发布时间】: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'
这些多行值的原因可能是什么以及如何将这些值对齐到适当的列中?
【问题讨论】:
【参考方案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',' ')
【讨论】:
以上是关于Hive 列-换行符的主要内容,如果未能解决你的问题,请参考以下文章
Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询
如何在 csv 文件中忽略带引号的换行符以创建 Hive 外部表?