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