将数据索引到AWS OpenSearch时的日期格式解析问题
Pandas数据导入AWS OpenSearch日期字段解析失败问题
报错信息
elasticsearch.helpers.errors.BulkIndexError: ('3 document(s) failed to index.', [{'index': {'_index': 'document', '_type': '_doc', '_id': '8db2e0ac6b659499cb0fd977a59bc3ce', 'status': 400, 'error': {'type': 'mapper_parsing_exception', 'reason': "failed to parse field [APPROVED_ON] of type [date] in document with id '8db2e0ac6b659499cb0fd977a59bc3ce'. Preview of field's value: '2020-07-06 08:05:00'", 'caused_by': {'type': 'illegal_argument_exception', 'reason': 'failed to parse date field [2020-07-06 08:05:00] with format [strict_date_optional_time||epoch_millis]', 'caused_by': {'type': 'date_time_parse_exception', 'reason': 'Failed to parse with all enclosed parsers'}}},
已尝试操作
尝试将APPROVED_ON字段转为字符串类型,但报错依旧:
data=data.astype({"APPROVED_ON": str})
数据结构信息
data.info()输出:
<class 'pandas.core.frame.DataFrame'> Int64Index: 11740 entries, 0 to 11739 Data columns (total 17 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ORDERS_NO 11740 non-null object 1 SUBJECT 11740 non-null object 2 ORG_FILENAME 11740 non-null object 3 IS_LAB_REP 11740 non-null float64 4 DOC_PATH 11740 non-null object 5 DM_FILENAME 11740 non-null object 6 ORDERS_ID 11740 non-null object 7 STATUS 11740 non-null object 8 PROJECT_NO 11740 non-null object 9 MODEL 11740 non-null object 10 PQM_NO 560 non-null object 11 REPORT_SENT_ON 11740 non-null object 12 APPROVED_ON 11002 non-null object 13 CONFIDENTIAL 11740 non-null float64 14 ORDER_DESCRIPTION 11740 non-null object 15 TASK_DESCRIPTION 11737 non-null object 16 TEXT_RESULT 5377 non-null object dtypes: float64(2), object(15) memory usage: 1.6+ MB
解决方案
方案1:调整OpenSearch索引的日期格式映射
问题核心是OpenSearch中APPROVED_ON字段被设为date类型,默认格式strict_date_optional_time||epoch_millis不支持空格分隔的yyyy-MM-dd HH:mm:ss格式(strict_date_optional_time要求用T分隔日期和时间,如2020-07-06T08:05:00)。
修改索引映射,添加兼容的日期格式:
PUT /document/_mapping { "properties": { "APPROVED_ON": { "type": "date", "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss" } } }
方案2:在Pandas中转换日期格式为OpenSearch兼容格式
将APPROVED_ON字段转为标准ISO格式的日期字符串:
import pandas as pd # 先转为datetime类型,自动处理空值 data['APPROVED_ON'] = pd.to_datetime(data['APPROVED_ON'], errors='coerce') # 转为ISO格式字符串(带T分隔符) data['APPROVED_ON'] = data['APPROVED_ON'].dt.isoformat() # 空值保留为None,OpenSearch会按null处理 data['APPROVED_ON'] = data['APPROVED_ON'].where(data['APPROVED_ON'].notna(), None)
方案3:强制将字段映射为字符串类型(不推荐)
如果不需要对该字段做日期相关查询,可修改索引映射将其设为keyword类型:
PUT /document/_mapping { "properties": { "APPROVED_ON": { "type": "keyword" } } }
注意:修改已有数据的索引映射时,需创建新索引重新导入数据,或使用reindex操作迁移数据。
内容的提问来源于stack exchange,提问作者Yafaa Ben Tili
相关产品推荐
相关产品推荐

