卵の痛みのmongo to hiveの導数の過程を覚えます
1.起因
一回のhiveの検査の過程の中で、hiveの中でデフォルトの10日の3000 w近くのデータを発見して、自問自答します:どのようにして、もちろん補数します!どこから補って、mongo(mongoの中に1部あります)!
mongoのデータはbson保存で、データ列はhiveとは違います!
2.ソリューション
シナリオ1:
だから、第一反応は
第一歩:
に質問
誤報:
シナリオ2:
考え方:
tip:コマンドラインと文法の差が少なく、出力フォーマットを自由に指定できます!これでhiveに直行できます
ステップ2:使用
注:
やったほうが早いでしょう--!
3.まとめ
穴をたくさん踏んでこそ、成長すると思います.ここでは、次の点について説明します.使用 shellスクリプトを使用してmongoデータをパーソナライズしてエクスポートする. cvsガイドmysql、文字列中の特殊文字の問題. cvsガイドhiveのスクリプト基本知識.
一回のhiveの検査の過程の中で、hiveの中でデフォルトの10日の3000 w近くのデータを発見して、自問自答します:どのようにして、もちろん補数します!どこから補って、mongo(mongoの中に1部あります)!
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
ステップ2:cvs to mysql
文:LOAD DATA LOCAL INFILE '/home/xxx/xx00' INTO TABLE xxxtable FIELDS TERMINATED BY ',' LINES TERMINATED BY '
';
エピソード:mongo_data.cvs
データが大きすぎて60 G以上、採用split
切り分けsplit -50000 mongo_data.cvs
、ファイルごとに5 w行切り分け、1回目のテストではまず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
ステップ1:新規スクリプト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+"
");
}
tip:コマンドラインと文法の差が少なく、出力フォーマットを自由に指定できます!これでhiveに直行できます
ステップ2:使用
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の最初の2行の出力を削除する:sed -i '1,2d' outbox
ステップ3:ガイド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データのエクスポート.mysql,hive,mongo
間データ導入導出方法.