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

添付のような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}}}}]')

こんにちわ

手元の環境(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のバージョンなど添えていただければ、他の方の回答をしやすいかと思います。
よろしくお願いします。

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

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

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

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

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.