Хо, чтобы прочитать AWS Афина ответ эффективно в Python Лямбда - PullRequest
0 голосов
/ 03 марта 2020

Я получаю ответ типа ниже от Афины:

{
    'UpdateCount': 0,
    'ResultSet': {
        'Rows': [{
            'Data': [{
                'VarCharValue': 'cc_code'
            }, {
                'VarCharValue': 'inv_id'
            }, {
                'VarCharValue': 'sno'
            }, {
                'VarCharValue': 'lrt'
            }, {
                'VarCharValue': 'lat'
            }, {
                'VarCharValue': 'long'
            }, {
                'VarCharValue': 'add'
            }]
        }, {
            'Data': [{
                'VarCharValue': 'YYY'
            }, {
                'VarCharValue': '2222'
            }, {
                'VarCharValue': '20:0100'
            }, {
                'VarCharValue': '2019-12-18T02:03:32Z'
            }, {
                'VarCharValue': '144.9194613051093'
            }, {
                'VarCharValue': '-22.879158430049'
            }, {
                'VarCharValue': 'UK'
            }]
        }, {
            'Data': [{
                'VarCharValue': 'ZZZZ'
            }, {
                'VarCharValue': '3333'
            }, {
                'VarCharValue': '10:010030015943960'
            }, {
                'VarCharValue': '2020-02-27T23:34:50Z'
            }, {
                'VarCharValue': '45.5014953316149'
            }, {
                'VarCharValue': '-122.562085095768'
            }, {
                'VarCharValue': 'IND'
            }]
        }],
        'ResultSetMetadata': {
            'ColumnInfo': [{
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'cc_code',
                'Label': 'cc_code',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'inv_id',
                'Label': 'inv_id',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'sno',
                'Label': 'sno',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'lrt',
                'Label': 'lrt',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'lat',
                'Label': 'lat',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'long',
                'Label': 'long',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }, {
                'CatalogName': 'hive',
                'SchemaName': '',
                'TableName': '',
                'Name': 'add',
                'Label': 'add',
                'Type': 'varchar',
                'Precision': 2147483647,
                'Scale': 0,
                'Nullable': 'UNKNOWN',
                'CaseSensitive': True
            }]
        }
    },
    'ResponseMetadata': {
        'RequestId': '2b9dabae',
        'HTTPStatusCode': 200,
        'HTTPHeaders': {
            'x-amzn-requestid': '2b9dabae-1',
            'content-type': 'application/x-amz-json-1.1',
            'content-length': '7500',
            'date': 'Tue, 03 Mar 2020 08:19:45 GMT'
        },
        'RetryAttempts': 0
    }
}

Я хочу получить некоторые значения из этого ответа и выполнить дальнейшую обработку с этими атрибутами. Я пробовал с нижеследующим подходом, но он кажется не чистым.

query_result['ResultSet']['Rows'][1]['Data'][1]['VarCharValue']

Сначала проблема заключается в том, что «данные» приходят из имен столбцов, а фактические данные поступают из данных [1 - так далее]. Я не хочу ставить 2 для циклов, чтобы читать мои атрибуты, а также не хочу получать столбцы, давая жестко закодированные индексы. Есть ли лучший способ прочитать ответ Афины в python лямбда.

1 Ответ

0 голосов
/ 03 марта 2020

Вы должны использовать индексы в l oop или из l oop, но для структурирования json вы можете использовать вспомогательный метод, такой как

import json
from types import SimpleNamespace as Namespace
def json2obj(data):
    return json.loads(data, object_hook=lambda d: Namespace(**d))

Вызовите этот метод, и он проанализирует ваш json, например,

parsed_result = json2obj(query_result)

Теперь вы можете получить доступ к своим значениям с помощью точки, например

parsed_result.UpdateCount
parsed_result.ResponseMetadata.RequestId
...