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 列-换行符的主要内容,如果未能解决你的问题,请参考以下文章

hive 行分隔符怎么指定? 有指定的必要吗?

hive导入到clickhouse的几种方式总结

Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询

如何在 csv 文件中忽略带引号的换行符以创建 Hive 外部表?

hive中 regexp_replace的用法,替换特殊字符问题

hive sql 中换行字符的替换