前提:在此使用 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: 表中字段隻留下一小部分作為示例,前後無關聯;