Ошибка формата Kinesis firehose, неправильный анализ JSON из Python - PullRequest
0 голосов
/ 24 октября 2019

Я использую лямбда-функцию в Python для передачи некоторых данных в поток Kinesis с помощью Kinesis Firehose и S3

лямбда, которую я использую:

import boto3
import json
import copy

kinesis_client = boto3.client('kinesis')
kinesis_stream_name = "Log"
nlu_result = dict()
user_input = dict()
user_input['text'] = "first test log, my birth documents"
user_input['text_clean'] = "first test log my birth document"
user_input['intent'] = {"intent_name":"profile_dob","confidence":0.5911795496940613}
user_input['entities'] = [{"entity_start":4,"entity_end":5,"entity":"document","entity_value":"birth certificate"}]
user_input['intent_ranking'] = [{"intent_name":"profile_dob","confidence":0.5911795496940613},{"intent_name":"dep_info_update","confidence":0.21952849626541138},{"intent_name":"dep_docs_how","confidence":0.06718753278255463},{"intent_name":"cobra_election_form_submit","confidence":0.0511532723903656}]
nlu_result['user_input'] = user_input
nlu_result['model'] = "model_20191010-1941"
nlu_result['log_time'] = 1571786981.954844
nlu_result['user_number'] = 12345
nlu_result['transcript_number'] = 98754

def push2kinesis(event, context):
    log_result = copy.deepcopy(nlu_result)
    # Wraps all numeric into quotes
    for k, v in log_result.items():
        if type(v) == dict:
            v['intent']['confidence'] = str(v['intent'].get('confidence'))
            # iter over list of entities
            for x in v['entities'], v['intent_ranking']:
                for e in x:
                    for k1, v1 in e.items():
                        if type(v1) != str:
                            e[k1] = str(v1)
        else:
            log_result[k] = str(v)
    # Use transcript number for partition key
    partition_key = log_result.get('transcript_number')
    kinesis_client.put_record(
        Data=json.dumps(log_result),
        StreamName=kinesis_stream_name,
        PartitionKey=partition_key
    )
    print(json.dumps(log_result))

Сообщение об ошибке Iget is: "lastErrorMessage": "Данные не соответствуют схеме. Данные не являются JSONObject, а java.lang.String со значением {\" text \ ": \" Журнал первого теста, документы о моем рождении \ ", \" text_clean \": \" первый тестовый журнал, мой документ о рождении \ ", \" намерение \ ": {\" имя_интеллекта \ ": \" profile_dob \ ", \" trust \ ": 0.5911795496940613}, \" entity \ ": [{\ \"entity_start \": 4, \ "entity_end \": 5, \ "entity \": \ "document \", \ "entity_value \": \ "свидетельство о рождении \"}], \ "intent_ranking \": [{\ "intent_name \": \ "profile_dob \", \ "trust \": 0.5911795496940613}, {\ "intent_name \": \ "dep_info_update \", \ "trust \": 0.21952849626541138}, {\ "intent_name \":\ "dep_docs_how \", \ "trust \": 0.06718753278255463}, {\ "intent_name \": \ "cobra_election_form_submit \", \ "trust \": 0.0511532723903656}]} ",

но когда я печатаюжурнал я толкаю в Кинезисна лямбда-консоли я получил следующее: {"user_input": {"text": "журнал первого теста, мои документы о рождении", "text_clean": "журнал первого теста, мой документ о рождении", "intent": {"intent_name":"profile_dob", "trust": "0.5911795496940613"}, "entity": [{"entity_start": "4", "entity_end": "5", "entity": "document", "entity_value": "свидетельство о рождении"}]," intent_ranking ": [{" intent_name ":" profile_dob "," trust ":" 0.5911795496940613 "}, {" intent_name ":" dep_info_update "," trust ":" 0.21952849626541138 "}, {" intent_name ":"dep_docs_how", "trust": "0.06718753278255463"}, {"intent_name": "cobra_election_form_submit", "уверены": "0.0511532723903656"}]}, "model": "model_20191010-1941", "log_time": "15548441", "user_number": "12345", "transcript_number": "98754"}

Что является допустимым JSON. Может кто-нибудь сказать мне, что здесь происходит?

...