天天看点

MongoDB 导出数据到 kudu

前提:在此使用 impala 作为计算引擎对 kudu 进行查询

基本流程:

1. impala 创建文本类型 外部表 并指定文件夹和分隔符

# 创建临时的外部表,指向刚才写入的文件夹
drop table if exists  wg.F_05dfe85a705d;
create external table wg.F_05dfe85a705d(
id bigint,
province string,
openid string,
unionid string,
remark string,
groupid int,
tag string,
gmtCreate timestamp
)
row format delimited fields terminated by '|'
location '/user/impala/05dfe85a705d'
           

    ps:3月30日补充

        这里可以直接创建外部表,指定文件夹,然后上面datax直接写入这个文件夹

2.  Datax 读取MongoDB数据写入hdfs   

        关于这个导出可以使用 datax 来读出 mongo 直接写到hdfs上,这个功能主要是为 hive 设计的,不过再这里是一样的,impala也没问题的,经过踩坑不建议使用mongoexport工具导出csv的方式来处理,因为数据中‘,’太常见了,而mongoexprot导出csv只能是 ',' 分割,使用的"转译,impala/hive 并不买账,还是认为是两个字段。

        使用datax 可以指定分隔符,关于使用方法:因为是阿里开源的中文文档很方便。

        https://github.com/alibaba/DataX

        有个已知的问题,datax 导出MongoDB对于不存在的列可能就丢了,也没有分隔符,导致 hive/impala 的列会丢,这个问题已经解决了,但是需要自己下载源码编译,打包好的版本可能比较旧。具体方法详见 GitHub 介绍和 issue。

3. 查询临时表数据存入 kudu 正式表

-- select并创建表
-- 用 bigint 代替timestamp 因为kudu不支持,timestamp使用 unix_timestamp 转换成 bigint (1970年至今的**秒数**!!)
CREATE TABLE morekudu
PRIMARY KEY(id)
PARTITION BY HASH(id) PARTITIONS 8
STORED AS KUDU
AS SELECT 
id,unionid,subscribe,sex,country,groupid,tag,unix_timestamp(gmtCreate) AS gmtCreate 
FROM texttemp;

完活

           
-- 如果手残了,重新覆盖一遍  
INSERT INTO wg.morekudu  
SELECT   
id,unionid,subscribe,sex,country,groupid,tag,unix_timestamp(gmtCreate) AS gmtCreate FROM default.texttemp; 
           

ps: 表中字段只留下一小部分作为示例,前后无关联;