Python Elasticsearch не принимает массив данных - PullRequest
0 голосов
/ 28 ноября 2018

Я в основном пытаюсь проиндексировать данные из кадра данных, поступающего из файла CSV.

Я успешно создал индексы.

es.indices.create(index='hash_test', ignore=400)

И добавил базовые индексы со столбцами и образцами данных, содержащимися в моем фрейме данных

       es.index(index="hash_test", doc_type="hash-test", id=rand_id, body={
         'FILENAME': '6.js', 
         'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 
         'DATE': '2018-11-15'})

Что работало нормально.

Ниже показано, как я хочу проанализировать мой фрейм данных в нужный формат, выполнить итерацию по строкам и проиндексировать данные в Elasticsearch, как описано выше.

def index_data(data_path, chunksize, index_name, doc_type):
    f = open(data_path)
    csvfile = pd.read_csv(f, iterator=True, chunksize=chunksize,sep="£",encoding="utf-8-sig",index_col=0,engine="python") 
    dictionary = {'Â':''}
    es = Elasticsearch('http://*.*.*.*:9200/')

    for i,df in enumerate(csvfile):
        rand_id = uuid.uuid4();
        df.replace(dictionary, regex=True, inplace=True)
        df.columns = df.columns.str.replace('Â', '')
        records=df.where(pd.notnull(df),None).T.to_dict()
        list_records=[records[it] for it in records]
        json_data = str(''.join(str(v) for v in list_records))
        try:
            es.index(index_name, doc_type, rand_id, json_data)
        except:
            print("error!")
            pass

Мне пришлось провести некоторый анализ кадра данных, так как странный символ был в каждой строке и столбце (Â).

Когда я печатаю значения Iхочу индексировать

print(index_name, doc_type, rand_id, json_data)

Я получаю именно то, что хочу

hash_test hash-test 51eacee2-e2b1-4886-82f5-1373ec59c640 {'FILENAME': '6.js', 'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 'DATE': '2018-11-15'}

Однако при запуске я получаю следующую ошибку:

RequestError: RequestError(400, 'mapper_parsing_exception', 'failed to parse')

Что пытаетсяПОСТАВИТЬ следующие данные:

{"_index":"hash_test","_type":"hash-test","_id":"{'FILENAME': '8.js', 'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 'DATE': '2018-11-15'}","found":false}

Полностью игнорирует параметр rand_id, а когда я делаю следующее:

es.index(index_name, doc_type, json_data, rand_id)

Игнорируется параметр json_data .....

{"_index":"hash_test","_type":"hash-test","_id":"93eadd1b-6859-474b-9750-b618b800b4d5","found":false}

Я не понимаю различий в выводе, который я получаю, и я озадачен тем, как тело оказывается в поле _id, когда я указал параметр id.

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 29 ноября 2018

Поэтому неудивительно, что я слишком усложнил то, что мне нужно было сделать, создав чистую строку JSON из моего фрейма данных.Вместо того чтобы использовать словарь, а затем использовать список (который, как мне кажется, является источником моих ошибок), я понял, что гораздо проще просто использовать функцию to_json в пандах.

Приведенный ниже код очищает этои индексирует мой dataframe в мой экземпляр Elasticsearch.

def index_data(data_path, chunksize, index_name, doc_type):
    f = open(data_path)
    csvfile = pd.read_csv(f, iterator=True, chunksize=chunksize,sep="£",encoding="utf-8-sig",index_col=0,engine="python") 
    es = Elasticsearch('http://*.*.*.*:9200/')

    for i,df in enumerate(csvfile):
        rand_id = uuid.uuid4(); #create a random id
        data=df.to_json(orient='records', lines=True)
        try:
            es.index(index=index_name,doc_type=doc_type,id=rand_id,body=data)
        except TransportError as e:
            print(e.info)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...