卵の痛みのmongo to hiveの導数の過程を覚えます


1.起因
一回の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 shellmongoexport問題が解決できないので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.まとめ
    穴をたくさん踏んでこそ、成長すると思います.ここでは、次の点について説明します.
  • 使用mongoexportmongoデータのエクスポート.
  • shellスクリプトを使用してmongoデータをパーソナライズしてエクスポートする.
  • cvsガイドmysql、文字列中の特殊文字の問題.
  • cvsガイドhiveのスクリプト基本知識.
  • mysql,hive,mongo間データ導入導出方法.