記一次蛋疼的mongo to hive導數過程
1. 起因
一次hive查數過程中,發現hive中缺省了10天的近3000w的資料,自問自答:怎麼辦,當然是要補數啊!從哪裡補,mongo啊(還好mongo中有一份)!
mongo中資料是bson儲存,而且資料列與hive不一樣!
2. 解決方案
方案1:mongoexport
思路:由於mongoexport
只能以逗號分割欄位,所以要導到hive裡面最快的方式就是,利用mysql可以導逗號的cvs檔案,還可以指定列,並且約束嚴格可以方便的檢查資料正確性。
所以,第一反應是mongo to cvs to mysql to hive
,但是很快就失敗了,過程還是要記錄下來的!
第一步
mongo to cvs
語句:sudo ./mongoexport -hxxx --port xxx -u xxx -pxxx -d sms -c outbox1 --type=csv -f id,type,mobile, -q '{optime:{$gte: "2017-02-19 05:40:00", $lte: "2017-02-20 05:40:00"}}' -o /home/q/temp_mongo/mongo_data.cvs
第二步:cvs to mysql
語句:LOAD DATA LOCAL INFILE '/home/xxx/xx00' INTO TABLE xxxtable FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
插曲:mongo_data.cvs
資料太大60多G,採用split
切分split -50000 mongo_data.cvs
,每個檔案5w行切分,第一次測試就先切1000行吧:csplit /mongo_data.cvs 1000
先將檔案切成了2份!
問題
mongoexport
對字串不加"
導致欄位中包含逗號,
,導致匯入失敗!(知道為啥不直接到hive了吧,導數過程肯定有問題啊,mysql解決問題多方便快捷)mongoexport
對於\
不會轉義,所以字串中出現\[漢字]
,eg : \請...
形式的字元,mysql無法識別。
報錯: [HY000][1300] Invalid utf8 character string: 'xxx'
最簡單的方法要解決這些問題太瑪法,迅速放棄,期待mongoexport
更智慧點吧,找其他快速解決的辦法!
方案2:mongo shell
mongoexport
不能解決問題,藉助shell也許是最快的辦法了。
思路:mongo shell to cvs to hive
第一步: 新建指令碼 export.js
db.auth("xxx","xxx");
conn = new Mongo();
db = conn.getDB("xxxdb");
var cur = db.xxxdb.find({optime:{$gte: "2017-02-19 05:40:00", $lte: "2017-02-20 05:40:00"}});
var obj;
while(cur.hasNext()){
obj = cur.next();
print(obj.id+"\t"+ ... +"\t"+obj.subaccount+"\n");
}
tip: 和在命令列語法差不多,可以隨意指定輸出格式!這樣就可以直接一步到hive了
第二步: 使用mongo
執行cd .../mongodb/bin
目錄下的mongo指令碼,./mongo --help
檢視幫助
sudo ./mongo xxxip:30000/xxdb -u xxx -p xxx export.js > /home/q/temp_mongo/outbox
注:export.js
放在當前目錄,所以沒有路徑!並且要刪除outbox前兩行輸出: sed -i '1,2d' outbox
第三步:導hive
#!/usr/bin/env bash
source /etc/profile
eval cd $(dirname $0)
currentDir=$(pwd)
line="xxx"
_HIVE_TABLE=xxxdb
PATH_FILE="${currentDir}/xxx"
gzip ${PATH_FILE}
PATH_GZ="${PATH_FILE}.gz"
echo "PATH_GZ:${PATH_GZ}"
hive -e "set mapreduce.job.name = ${0}_xxx;USE wirelessdata; \
alter table ${_HIVE_TABLE} add IF NOT EXISTS PARTITION(num='${line}'); \
LOAD DATA LOCAL INPATH '${PATH_GZ}' OVERWRITE INTO TABLE ${_HIVE_TABLE} partition(num=${line});" || exit 1
rm -f ${PATH_FILE}
rm -f ${PATH_GZ}
echo "end success."
搞定,也算比較快的方式吧- -!
3. 總結
我想只有坑踩多了,才會成長吧!你將從本文獲取如下知識點:
使用
mongoexport
匯出mongo資料。使用shell指令碼個性化匯出mongo資料。
cvs導mysql,字串中特殊字元的問題。
cvs導hive的指令碼基本知識。
mysql,hive,mongo
之間資料匯入匯出方法。
相關推薦
記一次蛋疼的mongo to hive導數過程
1. 起因 一次hive查數過程中,發現hive中缺省了10天的近3000w的資料,自問自答:怎麼辦,當然是要補數啊!從哪裡補,mongo啊(還好mongo中有一份)! mongo中資料是bson儲存,而且資料列與hive不一樣! 2. 解決方案
記一次蛋疼的小程式證書bug
記一次蛋疼的小程式bug 事情是這樣的,之前我的小程式都是本地端的,資料存在手機上,雖然小程式官方聲稱存在手機內的資料不會丟失,然而還是經常會出現莫名其妙所有資料丟失的問題,引來不少使用者抱怨。遂決心把這個問題解決掉,打算弄了一臺伺服器。 寫過小程式的朋友都
記一次蛋疼的面試
時間:3月9號下午兩點 過程:8號上午接到的面試通知,然後準備了一天。今天過去,按她郵件上說的找到了他們公司,括弧(下面的一個事業部),以為跟往常一樣呢,先給筆試,然後面試下。結果那妹子讓我等會兒,一會兒領出來個頭直接進去面試了,不知道什麼情況。進去就聊了起來,其實就是他在
記一次安卓Unable to Merge dex的解決方法
最近課設用安卓寫,遇到了一個bug,花了差不多兩個小時才解決。這是一個安卓執行時的異常,多半是第三方包重複引入而引發的異常。 在網上找了好久,都沒發現解決方法。然後衝著死馬當活馬醫的想法,把衝突的第三方包全刪了。它竟然好了! 在project下找到衝突的包,點開然
一次蛋疼的webservice客戶端編寫
內網調外網webservice,連線超時。給做了埠對映,開放了80埠。瀏覽器可以訪問伺服器的wsdl檔案,就是連線超時。不知道啥情況。 同一個jar 在外網訪問沒問題, 同事的php程式 在我這臺機器上網伺服器htt
記一次完整的asp.net-mvc頁面優化過程
泄露 但是 項目 nbsp 左側菜單 工具 登錄 分享圖片 info 最近在重構一個MVC項目,項目結構堪稱混亂,問題多多,但今天說的是頁面打開速度的問題。項目中包括web後臺系統,幾乎隨便點一個頁面都要盯著白屏等待2-5秒之久,體驗很差。通過對頁面性能逐步的分析和判斷,並
記一次成功的arp流量轉發以及實驗過程中出現的問題
0x00 前言 之前筆者仔細學習了arp協議和arp欺騙的原理和細節,這裡通過kali linux和其他虛擬機器完成一個實驗 實驗環境: kali linux 2018.2(32位) winxp(32位) ,均為虛擬機器 實驗工具:arpspoof,
記一次linux下用git安裝fastadmin的過程
1.安裝寶塔面板,阿里雲配置對應的安全組.在軟體管理介面下載mysql,php,apache,pm2管理器,phpmyadmin.(php版本最好只安裝一個,不然你需要確定你安裝的擴充套件是否安裝在你所選擇的php版本,php -v可以檢視當前預設的php版本) 2.進入網站目錄,clone
記一次訪問Web服務偶爾不通問題解決過程
現象:我們部署的一個WEB服務,公司使用者在訪問過程中,時不時的遇到訪問超時,訪問失敗等問題 定位:通過抓包工具分析,發現client在傳送TCP SYN包後,Server沒有回覆SYN+ACK報文 問題原因:公司使用者通過無線網路或者有線網路,均是NAT網路。開啟tcp_tw_recy
記一次Mysql佔用記憶體過高的優化過程
一.環境說明: 作業系統:CentOS 6.5 x86_64 資料庫:Mysql 5.6.22 伺服器:阿里雲VPS,32G Mem,0 swap 二.問題情況: 1.某日發現公司線上系統的Mysql某個例項的從庫長時間記憶體佔用達到60%如下圖 2.於是開始
記一次自建CDN非法請求的處理過程。
問題是這樣的:突然有一天,伺服器上突然有了很多502的狀態碼。當時嚇差點沒嚇得的吃手。於是有了下面的排查和處理過程。 ----------------------------------------------------------------- 第一步:先到伺服器篩選
解Bug之路-記一次中介軟體導致的慢SQL排查過程
解Bug之路-記一次中介軟體導致的慢SQL排查過程 前言 最近發現線上出現一個奇葩的問題,這問題讓筆者定位了好長時間,期間排查問題的過程還是挺有意思的,正好部落格也好久不更新了,就以此為素材寫出了本篇文章。 Bug現場 我們的分庫分表中介軟體在經過一年的沉澱之後,已經到了比較穩定的階段。而且經過線上壓
解Bug之路-記一次中間件導致的慢SQL排查過程
有一個 bug 第一條 builder mstr 引入 i++ 原來 中間 解Bug之路-記一次中間件導致的慢SQL排查過程 前言 最近發現線上出現一個奇葩的問題,這問題讓筆者定位了好長時間,期間排查問題的過程還是挺有意思的,正好博客也好久不更新了,就以此為素材寫出了本篇文
記一次Oracle資料庫遷移到Mysql資料庫的過程
很簡單,我用的Navicat for mysql 12 搞定的 首先用 Navicat for mysql 連結上這兩個資料庫 然後 工具--資料傳輸 然後選擇好 源資料庫 和目標資料庫 然後在 選項 tab 勾上 遇到錯誤時繼續 然後一路下
記一次在虛擬機器上搭建ftp伺服器過程
環境:Windows7+VMware14.0+Ubuntu16.04 第一步:在Ubuntu上安裝vsftpdsudo apt-get update sudo apt-get install vsft
記一次Oracle分割槽表全域性索引重建的過程
1、查詢資料庫各個表空間利用率: SELECT Upper(F.TABLESPACE_NAME) "表空間名", D.TOT_GROOTTE_MB "表空間大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
記一次記憶體溢位問題的排查、分析過程及解決思路
謹以此文獻給自學路上的兄弟 起因 這個測試工具的開發已有一段時間了,由於資料量過大,寫入資料較慢,導致工具執行耗時較長,所以再次優化了實現方案,進行二階段的程式開發。 經優化後,2000 條資料寫入,耗時4秒,個人感覺,快了很多了。 於是,想批量執行下,看下耗時多長。 結果10分鐘、20分鐘、1 個小時過
記一次CentOS7進單用戶模式修改密碼的失敗經歷(faild to load SELinux policy freezing)
錯誤 load 解決方法 com IT ash 開啟 bre 學習 背景:Cent SO7.4root用戶密碼忘記,根據https://www.linuxidc.com/Linux/2016-08/134034.htm提供的放法修改完密碼之後系統啟動後一直停留在轉圈的界面(
記一次sshd啟動報錯,Failed to start OpenSSH server daemon.
sshd -t [[email protected] proj]# sshd -t @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY F
記一次nginx負載均衡轉發錯誤 “no live upstreams while connecting to upstream ”
先描述一下環境,前段的負載均衡轉發給nginx,nginx再轉發給後端的應用伺服器。 nginx配置檔案如下: upstream ads { server ap1:8888 max_fails=1 fail_timeout=60s;