Index作成後のmapping情報の変更について


#1

添付のようなcsvをjson形式に変換してElasticsearchにアップロードしたいと思っています。A列に日時、B~C列にサーバ名があり、時間毎の値(ここでは例としてCPU使用率)が記載されています。

以下のようなコードでindexを作成し、作成後、mapping情報を変更しようとしたところエラーが出ます。原因と対処法を教えていただけませんでしょうか?

import csv
import json
import pandas as pd
from datetime import datetime as dt
import elasticsearch
from elasticsearch import helpers

csvfile = "sample.csv"
df_csv = pd.read_csv(csvfile, encoding = "SHIFT-JIS")
json_str = df_csv.to_json(orient = 'records')
json_objs = json.loads(json_str)
url = "http://localhost:9200"
es = elasticsearch.Elasticsearch(url)

index作成

for json_obj in json_objs:
mybody = json_obj
es.index(index = myindex, doc_type = "collected_data", body = mybody)

上記はエラーは出ずに正常に処理されます。(Elasticsearchへ登録されたデータがkibana側で確認できる)

しかし、以下を実行すると、下記「■エラーメッセージ」のようなメッセージが出てしまいます。やりたい事はpythonのコードから日時(DateTime)をDate情報として認識させたい事です。今文字列としてkibanaが認識してしまってます。

mapping = {
"properties": {
"DateTime": {
"type": "date",
"format":"yyyy-MM-dd HH:mm:ss"
}
}
}

es.indices.put_mapping(index = myindex, doc_type = "collected_data", body = mapping)

■エラーメッセージ
RequestError: RequestError(400, 'mapper_parsing_exception', 'Root mapping definition has unsupported parameters:
[mapping : {collected_data={properties={DateTime={type=date, format=yyyy-MM-dd HH:mm:ss}}}}]')


(tsgkdt) #2

こんにちわ

手元の環境(Es6.5.4)では、状況が再現しないため
今回は、マッピングが作成できない、ということですので、問題の切り分けのためにも、
データ投入をせずに、indexの作成とマッピングの作成だけをやってみてはいかがでしょう?

具体的にいうと、データ投入によってindexとmappingを暗黙的に作成するのではなく、
明示的にcreateとput_mappingしてみてはどうでしょうか。

手元の環境では以下でマッピングが期待通り作成されています。

# マッピング定義
mapping = {
    "properties": {
        "DateAndTime": {
            "type": "date",
            "format":"yyyy-MM-dd HH:mm:ss"
        }
    }
}

myindex = 'forum1224'
# indexの作成
es.indices.create(index=myindex)
# マッピングの作成
es.indices.put_mapping(index=myindex, doc_type='collected_data', body=mapping)

期待通りにmappingが作成できてから、実際にデータを入れる(es.index(..))していく方が良いと思います。

mappingの定義自体が正しいかを確認するのであれば、KibanaのDevToolsも使えます。

PUT forum1224
PUT forum1224/_mapping/collected_data
{
  "properties": {
    "DateAndTime": {
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss"
    }
  }
}

最後に、お使いのElasticsearchやelasticsearch-pyのバージョンなど添えていただければ、他の方の回答をしやすいかと思います。
よろしくお願いします。


#3

早々のお返事ありがとうございました。
お陰様で無事データの投入ができました。
先にindexやmappingを定義してしまえば良かったんですね。

Elasticsearchのバージョンや環境の記載が無く、失礼いたしました。
こちらの環境は以下です。
・elasticsearch 6.5.3
・kibana 6.5.3
・Windows 10
・Python 3.6.5(Anaconda)


(tsgkdt) #4

参考までにですが、6.5.4ではKibanaとbeatsで「a couple of notable issues」とされる修正が入ってますので、
検証環境かもしれませんが、最新をお使いいただくと良いように思います。
躓いたところが既知の不具合だったりすると、時間がもったいないですしね。


#5

tsgkdtさん
ご返信ありがとうございます。
追加の情報、ありがとうございます。
後日教えて頂いたバージョンへ移行しようと思います。