1. 程式人生 > >記一次蛋疼的mongo to hive導數過程

記一次蛋疼的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份!

問題

  1. mongoexport對字串不加"導致欄位中包含逗號,,導致匯入失敗!(知道為啥不直接到hive了吧,導數過程肯定有問題啊,mysql解決問題多方便快捷)

  2. 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. 總結

我想只有坑踩多了,才會成長吧!你將從本文獲取如下知識點:

  1. 使用mongoexport匯出mongo資料。

  2. 使用shell指令碼個性化匯出mongo資料。

  3. cvs導mysql,字串中特殊字元的問題。

  4. cvs導hive的指令碼基本知識。

  5. 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;