レコード:コマンドを使用して、2つの大量のデータ・テキストの内容が同じかどうかを比較します.

10356 ワード

コマンドを使用して、2つの大量のデータテキストの内容が同じレコードかどうかを比較します.
需要
DBには、|time|sum|の2列のデータがあり、ESでクエリされたjson形式の結果も、timeとsumの2つの結果を含む.両者のデータのtime-sumが一つ一つ一致するかどうかを比較する必要があります.データ量が大きく、人工的に1本のペアを外すのに適していないため、いくつかのツールを使用して実現する必要があります.
データの例
DB:
time
sum
121212121212
333
121212121213
666
ES:
{
  "took": 12558,
  "timed_out": false,
  "_shards": {
    "total": 2090,
    "successful": 2090,
    "skipped": 1940,
    "failed": 0
  },
  "hits": {
    "total": 5582253,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "appId": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "kkkkkkk",
          "doc_count": 5582253,
          "count": {
            "buckets": [
              {
                "key_as_string": "2019-08-29 13:45:00",
                "key": 1567086300000,
                "doc_count": 8405,
                "rc": {
                  "value": 8405
                }
              },
              {
                "key_as_string": "2019-08-29 13:46:00",
                "key": 1567086360000,
                "doc_count": 7687,
                "rc": {
                  "value": 7687
                }
              }
              ...

ps:aggregations->appId->buckets[0]->count->buckets[0]のkeyがtime,doc_countはsumであり、これら以外にも無駄なデータがたくさんあります.
ステップ
データをローカルに保存
Esは、クエリー結果を直接ローカルに保存する方法を採用しています.
db,1つのsqlを書いて、CSVフォーマットのデータを書き出します
select  UNIX_TIMESTAMP(STR_TO_DATE(convert(c_time,char),"%y%m%d%H%i")) * 1000, sum(c_count) from table where c_app_id = "kkkkkkkkk" and c_type = 0 and c_time >= 1908292145 and c_time < 1908300945 group by c_app_id, c_time

まずc_timeはint convertから文字列になりstr_を使用しますto_date関数を使用して、文字列を日付タイプに解析し、unix_を使用します.timestampはタイムスタンプに変わります.
ここではMySQLのいくつかの時間関数を紹介します
  • unixタイムスタンプは、グリニッジ時間1970年01月01日00時00分00秒から現在までの総秒数
  • と定義する時間表現である.
  • from_unixtime(unix_timestamp,format)
  • ここのunix_timestampは処理が必要なタイムスタンプ(このパラメータはUnixタイムスタンプ)、フィールド名、UNIXタイムスタンプ文字列、formatは変換が必要なフォーマットであってもよい.この関数はunixタイムスタンプを人間が理解できるフォーマットに変換することができる.

  • unix_timestamp([date])
  • 日付をunixタイムスタンプ
  • に変換
  • timestamp(expression, interval)
  • 単一パラメータの場合、関数は日付または日付時間式を返します.2つのパラメータがある場合は、パラメータを
  • と加算します.

    データパージ
    dbのCSVはまだきれいであることが分かったので,esとdbのフォーマットが一致することに重点を置く必要がある.
    以下はesデータの洗浄過程である
    スペースをクリア
    vimのグローバル置換機能の使用
    構文:%s///g
    構文:%s/old/new/g、ここでsは置換モードを表し、oldは置換する文字列を表し、newは新しい文字列を表す.彼は1行1行で処理され、gはglobalを表し、1行のすべてを置換し、gを持たないと1行で検索された最初のoldのみを置換する.%行番号は、ある行を変更することを意味し、%はすべての行を変更することを意味します.
    グローバル置換記事転送ポイントここ
    ####;「key」:1567129260000、「doc_count」:8233、同じ行にする
    vimを使用したグローバル置換機能でもあります
    コマンド:%s/,"doc_count/,"doc_count/g
    を選択します.
    異なるシステムでの改行文字の表示について
  • windowsでr
  • linuxは
  • です
  • macはr
  • 他のデータを洗い流し、「key」:1567129260000、「doc_count」:8233のみを保持します.
    ここでgrepパイプを使用してデータを抽出し、新しいファイルに配置します.
  • コマンドhead-n filename表示ヘッダn行のデータ
  • コマンドwc filenameは、ファイルを表示するデータが何行あるかを示す
  • grep「doc_count」、grepも行に従って探し、ターゲットフィールドを含む行を探します.「doc_count」を含む行を新しいファイルに出力する必要があります.
    コマンドはgrep""doc_count">tmp.log.es.cleanです
    再洗浄データ「key」などのフィールド
    vimのグローバル置換機能を使うか
    データをこのように洗浄する
    1567086300000,8405
    1567086300000,8406
    ...
    

    diffを用いて最後の比較を行う
    diff file1 file2
    diffコマンドは、ファイルの違いを比較するために使用されます.
    diffは、テキストファイルの異同箇所を行単位で比較します.ディレクトリを比較するように指定すると、diffはディレクトリ内の同じファイル名のファイルを比較しますが、サブディレクトリは比較しません.
    データが返されていない場合は、2つのファイルが同じであることを証明し、比較に成功しました.
    拡張コマンド
  • コマンドの出力が間違っています.再入力が必要です.ctrl+wのセグメントの削除
  • を押します.
  • vimクイックページめくり
  • ページ全体ctrl f ctrl d f-forward,d-backward
  • 半ページページページめくりctrl d ctrl u d-down,u-up
  • 1行ctrl e ctrly
  • を転がす
  • zzカーソル位置をスクリーン中央
  • に位置させる
  • ztはtopを表し、カーソルが行のトップ
  • になるようにする.
  • zb bはbottomを表し、カーソルの位置を
  • 低くする.
  • vimファイルの内容を消去
  • :%d

  • awkは強力なテキスト分析ツールです
  • -F':'は、区切り記号とは何かを表し、デフォルトはスペース
  • です.
  • awk-F':'{{print$1$2}'は、カッコに注意し、':'に従って各行を分割した後、第1列と第2列を出力し、真ん中にスペース
  • があることを意味する.
  • awk-F':'{{print$1',"$2}',に"","第1列の第2列の中間に1つ出力できる"."