HIVEからESへのマッピング、およびESの基本動作
ESの基本概念:
基本概念
まずElasticsearchのファイルストレージについて言えば、Elasticsearchはドキュメント型データベース向けであり、1つのデータはここで1つのドキュメントであり、JSONをドキュメントとしてシーケンス化されたフォーマットとして使用し、例えば以下のユーザーデータ:
Mysqlのようなデータベースストレージでは、Userテーブルを作成したり、balabalaのフィールドを作成したりすることが容易に考えられます.Elasticsearchではこれがドキュメントです.もちろん、このドキュメントはUserのタイプに属し、さまざまなタイプがインデックスに存在します.ここには、Elasticsearchとリレーショナルデータ用語を簡単に照合する表があります.
1つのElasticsearchクラスタに複数のインデックス(データベース)を含めることができます.つまり、多くのタイプ(テーブル)が含まれています.これらのタイプには多くのドキュメント(行)が含まれており、各ドキュメントには多くのフィールド(列)が含まれています.Elasticsearchのインタラクションは、Java APIを使用するか、HTTPのRestful API方式を直接使用することができます.例えば、記録を挿入するつもりで、HTTPのリクエストを簡単に送信することができます.
索引
Elasticsearchはどのようにして迅速なインデックスを作成しますか?
InfoQの記事では、Elasticsearchが使用している逆インデックスがリレーショナル・データベースのB-Treeインデックスよりも速いと言っていますが、なぜでしょうか.
B-Treeインデックスとは?
ツリー検索効率はlognで、新しいノードを挿入してもすべてのノードを移動する必要がないため、ツリー構造でインデックスを格納し、挿入とクエリーのパフォーマンスを両立させることができます.これに基づいて、従来のリレーショナル・データベースでは、ディスクの読み取り特性(シーケンス読み取り/ランダム読み取り)と組み合わせて、B-Tree/B+Treeのようなデータ構造が採用されています.
クエリーの効率を向上させ、ディスクのシーク回数を減らすために、複数の値を1つの配列として連続区間で格納し、1回のシークで複数のデータを読み出し、ツリーの高さを低減します.
逆インデックスとは?
上記の例を続けて、このようないくつかのデータがあると仮定します(about、interestsの2つのfieldを簡単に削除します):
IDはElasticsearchが作成したドキュメントidであり、Elasticsearchが作成したインデックスは以下の通りである.
Name:
Age:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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インデックス)
基本概念
まず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インデックス)