前提:在此使用 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: 表中字段只留下一小部分作为示例,前后无关联;