mongodb取數至數倉總結

2021-09-26 22:50:54 字數 3120 閱讀 4395

目的:使用mongoexport工具將mongo表資料抽到hive倉庫中(t+1)並進行初步清洗

遇到的問題:

1、抽數的科學記數法問題

2、json格式巢狀導致列錯亂的問題

通常做法:

1、使用如下命令將資料匯出csv格式

source /etc/profile;mongoexport --host ***xx \

--port 27012 --username *** --password '***' \

--db xx --collection smallclassbinds \

--type=csv  --fields open_id,mobile,source,createat \

--out  1567757233009.csv

2、使用sed命令刪掉第一行的column,然後將列轉為\t分割(建表的時候預設\t,也可以指定其他分隔符)

sed -i '1d;s/,/\\t/g' outfile.csv
3、執行hive的load命令

load data local inpath '/xx/temp.csv' overwrite into table test_ods.tmp_smallclassbinds_test partition (pt='2019-09-05');
但是,對於**號碼這種型別的再抽取出來的時候會被轉為科學記數法,如:1.8628164000e+10

mongo --host 172.21.xx.xx  --port ***x  *** -u*** -p'***x'

db.***.find().limit(1)

# 1.8628164000e+10

以下暫時能想到兩種解決方式:

1、使用mongo的api去讀取

2、使用shell命令進行解析替換

我這邊選用第二種方式,case by case:

awk -v fs=',' -v ofs=',' '' smallclassbinds.csv > 1_temp
然後在進行sed命令替換為\t分隔load到hive表中即可解決。

但是,對於mongo抽數中含有巢狀json的,如果處理成csv,你會發現列全亂了,所以以下奉獻json巢狀的處理方法:

1、首先需要建立如下的建**式

create table `ods.ods_userinfos_test`(

`id` string,

`open_id` string,

`tel` string,

`wxname` string)

partitioned by (

`pt` string)

row format serde 'org.apache.hadoop.hive.serde2.opencsvserde' with serdeproperties (

"separatorchar" = ",",

"quotechar" = "\""

) stored as textfile;

2、文字替換(只需要刪除第一行即可)

sed -i '1d' temp.csv
3、hive 的本地資料載入命令同上即可完成。

由於這種方式受限於磁碟的io操作,當單臺機器的負載上來之後,平時13分鐘就能完成的要1個多小時才能搞定,

所以針對這種型別的大任務我採用了spark處理,以上就是mongo抽數的過程,希望能幫到你!

2023年11月05日 星期四 補充 使用spark抽取mongodb資料

1、mongodb 查詢表結構

# 客戶端操作示例

mongo mongodb://user:pwd@ip:3717/db_name

use db_name

# 注意 collection 含有特殊字元的需要用這種方式獲取

db.getcollection("wx-users-lists").find().pretty();

2、時間格式處理

原來格式是:2019-02-21t11:21:34.146z   

spark抽取之後:1550819689831 (json)

改為標準時間格式:from_unixtime(cast (substr(get_json_object(regexp_replace(createat,'\\$',''),'$.date'),1,10) as bigint),'yyyy-mm-dd hh:mm:ss')

3、部分**示例

// 1. 定義case class

case class wx_users_lists(

_id: string,

open_id: string,

qr_scene_str: string,

qr_scene: string,

subscribe_scene: string,

tagid_list: string,

groupid: string,

remark: string,

unionid: string,

subscribe_time: string,

headimgurl: string,

country: string,

province: string,

city: string,

language: string,

***: string,

openid: string,

subscribe: string,

platform: string,

createat: string,

__v: string,

unsubscribe_time: string

)// 2. 定義方法

private def run_wx_users_lists(spark: sparksession, readconfig: readconfig, hive_db_table: string, pt: string): unit =

數倉分層總結

數倉分層 ods層 1 保持教據原貌不做任何修改,備份 2 建立分割槽表,防止後續的全表掃瞄 3 採用lzo壓縮,並建立索引 切片 4 建立外部表 多人共用 內部表 自己使用的臨時表 dwd層 1 數倉維度建模 星型模型 維度退化 商品表 品類表 spu表 分類 二級分類 一級分類 商品表 省份 地...

業務數倉總結

講課,備課,開發 業務資料倉儲的總結 一 表實體 訂單表 使用者表 商品分類 交易流水 二.表分類 實體表維度表 事務性事實表 週期性事實表 三.同步策略 全量新增 新增和變化 create time 和operate time cannal 正規化 1正規化 屬性不可切割 2正規化 不能存在部分函...

實時數倉與脫機數倉總結 一

精選30 雲產品,助力企業輕鬆上雲!主要內容 數倉基本概念 數倉架構演變 實時數倉和脫機數倉的區別 數倉基本概念 首先說一下資料倉儲的概念,以下簡稱數倉。數倉的發展 數倉有兩個環節 乙個是數倉的建設 另乙個數倉的應用。早期的數倉 傳統數倉 目前 數倉的架構演變 脫機數倉和實時數倉 接下來我會分別介紹...