我们在下面的hive中有表格,我们正在生成来自hive数据的平面文件,而我们在生成时发现在下面的数据中有垃圾字符我们在很多列中有很多字符可以任何人帮助我们从hive表或unix文件中删除那些垃圾字符?
Y,A,I,A
这里问题相同的数据需要在下载时向下游发送数据库,它显示为双倍美元,但我们设计代码双美元作为列分隔符。
答案 0 :(得分:0)
基本概念
hive> select regexp_replace('Hÿelloä íworlãd','[^a-zA-Z ]','');
OK
Hello world
从整个表中删除不需要的字符并将其导出到文件中。
create table t (i int,s1 string,s2 string);
insert into t values (1,'Hÿelloä','íworlãd'),(2,'ãGããood','Byÿe');
select * from t;
+---+---------+---------+
| i | s1 | s2 |
+---+---------+---------+
| 1 | Hÿelloä | íworlãd |
| 2 | ãGããood | Byÿe |
+---+---------+---------+
create external table t_ext (rec string)
row format delimited
fields terminated by '0'
location '/user/hive/warehouse/t'
;
insert overwrite local directory '/tmp/t_ext'
select regexp_replace(regexp_replace(rec,'[^a-zA-Z0-9 \\01]',''),'\\x01','<--->')
from t_ext
;
! ls /tmp/t_ext
;
000000_0
! cat /tmp/t_ext/000000_0
;
1<--->Hello<--->world 2<--->Good<--->Bye
答案 1 :(得分:0)
只要您的表格仅包含&#34;原语&#34;类型(没有结构,数组,地图等) 我真的把信封推到了这里。
create table t (i int, dt date, str string, ts timestamp, bl boolean);
insert into t select 1,current_date,'Hello world',current_timestamp,true;
select * from t;
+-----+------------+-------------+-------------------------+------+
| t.i | t.dt | t.str | t.ts | t.bl |
+-----+------------+-------------+-------------------------+------+
| 1 | 2017-03-14 | Hello world | 2017-03-14 14:37:28.889 | true |
+-----+------------+-------------+-------------------------+------+
select regexp_replace
(
printf(concat('%s',repeat('$$%s',field(unhex(1),*,unhex(1))-2)),*)
,'(\\$\\$)|[^a-zA-Z0-9 -]'
,'$1'
)
from t
;
1 $$ 2017-03-14 $$ Hello world $$ 2017-03-14 143728.889 $$ true