【问题标题】:Ho to read AWS Athena response effectively in Python Lambda如何在 Python Lambda 中有效读取 AWS Athena 响应
【发布时间】:2020-06-15 17:01:09
【问题描述】:

我从 Athena 得到以下类型的响应:

{
    '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 个 for 循环来读取我的属性,也不想通过提供硬编码索引来获取列。有没有更好的方法来读取 python lambda 中的 Athena 响应。

【问题讨论】:

    标签: json python-3.x amazon-web-services aws-lambda amazon-athena


    【解决方案1】:

    您必须在循环或循环外使用索引,但要构建您的 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
    

    【讨论】:

    • 得到类型错误:JSON 对象必须是 str、bytes 或 bytearray,而不是 'dict'
    • 您的输入不是有效的 json。尝试这样做 parsed_result = json2obj(json.dumps(query_result))
    • 现在出现此错误 NameError: name 'Namespace' is not defined。我是 Python 新手,不知道这里的 object_hook 和 Namespace 是什么意思。
    • 从类型导入 SimpleNamespace 作为命名空间
    • 在辅助函数退出的文件中添加,你也必须导入json以及编辑答案
    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2022-01-27
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多