我们在配置单元中有如下所示的表,我们正在从配置单元数据生成平面文件,同时我们正在生成我们发现在如下所示的数据中有垃圾字符我们在许多列中有许多字符有谁能帮助我们从配置单元表或unix文件中删除这些垃圾字符?ÿ,ä,í,ã这里的问题相同的数据需要发送下游当他们加载到那里的数据库,它显示为双美元,但我们设计了代码双美元作为列分隔符。
iovurdzv1#
基本概念
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
z9smfwbn2#
只要您的表只包含“基本”类型(没有结构、数组、Map等),这种方法就可以工作。我真的把信封推到这里了。
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$$真实
2条答案
按热度按时间iovurdzv1#
基本概念
演示
从整个表中删除不需要的字符并将其导出到文件。
z9smfwbn2#
只要您的表只包含“基本”类型(没有结构、数组、Map等),这种方法就可以工作。
我真的把信封推到这里了。
演示
1$$2017-03-14$$hello world$$2017-03-14 143728.889$$真实