在 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'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...