如何解决在 Hive 中处理带和不带双引号的数据
有人可以指导我如何在 hive 中加载数据,在那里我得到“在某些行中,而在某些行中,数据没有”相同的列值。
(defun run-all ()
(mapcar #'funcall *all-interesting-functions*))
在上面 id '2' " 的数据中,desc 列值中没有。
我的创建声明:
Sample Data:
id,name,desc,uqc,roll,age
1,Monali,"abhc,jkjk",23,23
2,mj,nhiijkla,67,60
7,jena,"kdjuu,hsysi,juw",3,34,23
1,"/"coppers bars","rods and profiles"/",money,"/"coupling","FLANGES & CROSS OVER"/",60
加载数据时我没有收到任何错误。但是当我做 select * from testing.select 语句时没有执行。以上创建和选择语句工作正常如果数据带有“,但如果数据带有和不带有“则不起作用。
解决方法
目前正则表达式中的第三组用引号括起来(引号是强制性的)。尝试使引号可选 "?
- 表示零个或一个引号,同时使组内容非贪婪 (.*?)
,因此它不会在组内捕获额外的引号:
'input.regex'='^(\\d+?),(.*?),"?(.*?)"?,([0-9.]*),(\\d*),(\\d*).*'
使用 regexp_replace 测试您的数据示例,我还在第 3 组周围添加了可选斜线以将其从输出中删除:
with mytable as (
select stack(6,'1,Monali,"abhc,jkjk",23,23','2,mj,nhiijkla,67,60','7,jena,"kdjuu,hsysi,juw",3,34,"/"coppers bars","rods and profiles"/",money,"/"COUPLING","FLANGES & CROSS OVER"/","17",19"LCD PANEL FOR COMPUTER",60'
) as initial_data
)
select regexp_replace(initial_data,'^(\\d+?),"?/?(.*?)/?"?,(\\d*).*','$1 || $2 || $3 || $4 || $5 || $6'
) as parsed_result
from mytable
结果(由两个竖线和空格 ' || '
分隔):
parsed_result
1 || Monali || abhc,jkjk || || 23 || 23
2 || mj || nhiijkla || 67 || 23 || 60
7 || jena || kdjuu,juw || 3 || 34 || 23
1 || Monali || "coppers bars","rods and profiles" || || 23 || 23
2 || money || "COUPLING","FLANGES & CROSS OVER" || 67 || 23 || 60
2 || money || 17",19"LCD PANEL FOR COMPUTER || 67 || 23 || 60
因此,如果结果看起来不错,请在表 DDL 中使用此正则表达式:
'input.regex'='^(\\d+?),(\\d*).*'
在整个数据集上仔细测试并检查空值/空值,必要时修复正则表达式。
,试试这个标签:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。