我基本上是试图索引来自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
我必须对数据帧进行一些解析,因为每一行和每一列(Â)中都有一个奇怪的字符。
当我打印要索引的值时
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字段中的结局感到困惑。
请提前帮忙。
答案 0 :(得分:0)
因此,毫不奇怪,我通过从数据帧中创建干净的JSON字符串使我需要做的事情复杂化了。我学会了使用熊猫中的to_json
函数要容易得多,而不是使用字典然后使用列表(我想这是我的错误的根源)。
下面的代码将其清除,并将我的数据帧索引到我的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)