HIVEからESへのマッピング、およびESの基本動作

6429 ワード

ESの基本概念:
基本概念
まずElasticsearchのファイルストレージについて言えば、Elasticsearchはドキュメント型データベース向けであり、1つのデータはここで1つのドキュメントであり、JSONをドキュメントとしてシーケンス化されたフォーマットとして使用し、例えば以下のユーザーデータ:
{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25,
    "birthDate": "1990/05/01",
    "about" :    "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

Mysqlのようなデータベースストレージでは、Userテーブルを作成したり、balabalaのフィールドを作成したりすることが容易に考えられます.Elasticsearchではこれがドキュメントです.もちろん、このドキュメントはUserのタイプに属し、さまざまなタイプがインデックスに存在します.ここには、Elasticsearchとリレーショナルデータ用語を簡単に照合する表があります.
          ⇒     ⇒      ⇒      ⇒  (Columns)

Elasticsearch  ⇒   (Index)   ⇒   (type)  ⇒   (Docments)  ⇒   (Fields)  

1つのElasticsearchクラスタに複数のインデックス(データベース)を含めることができます.つまり、多くのタイプ(テーブル)が含まれています.これらのタイプには多くのドキュメント(行)が含まれており、各ドキュメントには多くのフィールド(列)が含まれています.Elasticsearchのインタラクションは、Java APIを使用するか、HTTPのRestful API方式を直接使用することができます.例えば、記録を挿入するつもりで、HTTPのリクエストを簡単に送信することができます.
PUT /megacorp/employee/1  
{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25,
    "about" :    "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

索引
Elasticsearchはどのようにして迅速なインデックスを作成しますか?
InfoQの記事では、Elasticsearchが使用している逆インデックスがリレーショナル・データベースのB-Treeインデックスよりも速いと言っていますが、なぜでしょうか.
B-Treeインデックスとは?
ツリー検索効率はlognで、新しいノードを挿入してもすべてのノードを移動する必要がないため、ツリー構造でインデックスを格納し、挿入とクエリーのパフォーマンスを両立させることができます.これに基づいて、従来のリレーショナル・データベースでは、ディスクの読み取り特性(シーケンス読み取り/ランダム読み取り)と組み合わせて、B-Tree/B+Treeのようなデータ構造が採用されています.
 
クエリーの効率を向上させ、ディスクのシーク回数を減らすために、複数の値を1つの配列として連続区間で格納し、1回のシークで複数のデータを読み出し、ツリーの高さを低減します.
逆インデックスとは?
上記の例を続けて、このようないくつかのデータがあると仮定します(about、interestsの2つのfieldを簡単に削除します):
| ID | Name | Age  |  Sex     |
| -- |:------------:| -----:| -----:| 
| 1  | Kate         | 24 | Female
| 2  | John         | 24 | Male
| 3  | Bill         | 29 | Male

IDはElasticsearchが作成したドキュメントidであり、Elasticsearchが作成したインデックスは以下の通りである.
Name:
| Term | Posting List |
| -- |:----:|
| Kate | 1 |
| John | 2 |
| Bill | 3 |

Age:
| Term | Posting List |
| -- |:----:|
| 24 | [1,2] |
| 29 | 3 |

 
 
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ESの基本操作:(新規作成、追加、削除、変更、調査)1.インデックスの作成:(飽和アルゴリズムモデルを例に:これは私が作ったプロジェクト名)PUT/clue_strategies_clue_saturation/{     "mappings": {       "clue_saturation": {         "properties": {           "uid": {             "type": "integer"          },            "status": {             "type": "integer"          },           "saturation_cnt":{             "type":"integer"          },           "dt": {             "type": "keyword"        }         }      }   } }
2.クエリインデックス:GET/clue_strategies_clue_saturation/clue_saturation/_mapping?pretty
3.索引の削除:
DELETE/clue_strategies_clue_saturation/
3.1 ESで指定された条件のデータを削除する
指定条件データの削除:POST/clue_strategies_clue_saturation/_delete_by_query { "query": {  "match": { "dt": "2019-09-02"} } }
 
4.新規データ:POST/clue_strategies_clue_saturation/clue_saturation/{   "uid":1,   "status":1,   "saturation_cnt ":10,   "dt":"2019-07-23"  }
 5.クエリーデータ:
5.1時間範囲照会:(7月25日のデータを照会)POST/clue_strategies_clue_saturation/clue_saturation/_search?pretty {
  "size": 5600,  
  "query": {
    "range": {
      "dt": {
「lt」:「2019-07-26」--より小さい
「gte」:「2019-07-25」--以上
      }
    }
  }}
5.2クエリーのソート:(ステータス降順クエリー)
  POST/clue_strategies_clue_saturation/clue_saturation/_search?pretty {
  "query": { "match_all": {} },
  "sort": { "status": { "order": "desc"} }
}
5.3クエリー指定列:
POST/clue_strategies_clue_saturation/clue_saturation/_search?pretty {
  "query": { "match_all": {} },
  "_source": ["status", "saturation_cnt"]
}
5.4条件付きクエリー:(クエリーのステータスが8の値)
POST/clue_strategies_clue_saturation/clue_saturation/_search?pretty {
  "query": { "match": { "status": 8} }
} 6.問題:
フィールドタイプが異なる:int ESエラー:バージョンの問題をintegerに変更
decimal(10,5)はstring ESとデータがあり、hiveクエリはhiveになってstring ESになってkeywordになるとエラー解決
decimal(10,5)とdoubleもダメ
ユニークインデックスの作成をサポート
データがない:esを加える.index.read.missing.as.empty'='true'
7.飽和度構築表:
------飽和度テーブルCREATE TABLE`features.app_sale_clue_status_saturation_result_Es`(uid int COMMENT'学則ID',status int COMMENT'手がかり状態',saturation_cnt int COMMENT'飽和度',dt string COMMENT'日付')COMMENT'学則手がかり飽和度(学則+手がかり状態粒度)'STORED BY'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES ('es.index.auto.create'='false','es.index.read.missing.as.empty'='true'、--クエリが空の値でエラーを報告することを防止'es.mapping.names'='uid:uid,status:status,saturation_cnt:saturation_cnt,dt:dt',--hiveフィールドに対応するESフィールド'es.net.http.auth.auth.pass'='ESパスワード'es''''.es.net.http.auth.auth.auth.user'='ESログイン名'''''''''ESログイン名'''''''''''''',--ESログイン名'es.nodes'='es-cn-0 pp 165u 620001 xs3r.elasticsearch.aliyuncs.com',--ESアドレス'es.nodes.wan.only'='true',  'es.nodes.discovery' = 'false', 'es.port'='9200',  'es.read.metadata'='true',  'es.resource'='clue_strategies_clue_saturation/clue_saturation'--ESインデックス)