从hive表或unix中删除Junk charcters

时间:2017-03-14 14:24:07

标签: sql regex hadoop hive hiveql

我们在下面的hive中有表格,我们正在生成来自hive数据的平面文件,而我们在生成时发现在下面的数据中有垃圾字符我们在很多列中有很多字符可以任何人帮助我们从hive表或unix文件中删除那些垃圾字符?

Y,A,I,A

这里问题相同的数据需要在下载时向下游发送数据库,它显示为双倍美元,但我们设计代码双美元作为列分隔符。

2 个答案:

答案 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