由于kudu修改hostname导致数据raft无法自动刷新,无法写入和修改所以需要做好备份。
方法0:最简单的方法是建好一张和需要备份的表一样的kudu表
INSERT INTO TABLE some_parquet_table SELECT * FROM kudu_table
方法一:(在Hue中进行即可)
1,利用impala进行备份,将Kudu表结构转化为impala表结构(其数据存储在hdfs中)
提前建好impala表
CREATE TABLE xxx1(
id INT ,
user_id_add INT ,
wx_identity STRING
)
row format delimited fields terminated by ','
row format delimited fields terminated by ','
insert into xxx1 select * from xxx2
2,上面有个简单方法
create table xxx1 as select * from xxx2
省去了去找建表语句和去掉一些冗余的列属性的步骤,这样更简便。
但是以上步骤对于一些字段少,且没有什么特殊字符的值来说,可以搞定,但是我用以上方法导出之后发现数据比源表多了很多,一查发现,有些字段的值中 存在 ‘\n\0’ 等特殊字符,用impala进行查询的时候遇到这些字符就换行成为了另外一条数据,所以导致数据多出!
所以对impala查出数据做处理,用impala String 函数中的 regexp_replace(string initial,string pattern,string replacement) 做处理
SQL变为
create table xxx1 as select id,user_id_add ,regexp_replace(wx_identity ,'[\n\0]','') from xxx2
用regexp_replace函数依次替换字段中需要替换的值
方法二,
用impala-shell进行
1,先把数据导出成CSV,或者TXT文件,不用进入impala-shell内部,用外部命令
impala-shell -q "select regexp_replace(*,'\n','') from music.xxx2" --delimited --output_delimiter="," -o /home/xxx1.txt
参数详解:
-q query查询
–delimited (-B) 去格式化输出
–output_delimiter 输出的分隔符
-o 输出文件
2,将xxx1.txt文件上传到hdfs某个目录下 (/tmp/test/)
3,修改权限 hdfs dfs -chmod 777 /tmp/test/xxx1.txt
4,建impala表
CREATE TABLE xxx1(
id INT ,
user_id_add INT ,
wx_identity STRING
)
row format delimited fields terminated by ','
location '/tmp/test/';
数据将自动映射为表数据
三,还原成kudu表数据
1,建好kudu表
CREATE TABLE xxx_kudu
(
id INT ,
user_id_add INT ,
wx_identity STRING ,
primary key(id)
)
STORED AS KUDU;
2, insert into xxx_kudu select * from xxx1