天天看點

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