Boto3 Запись в DynamoDB из AWS Glue, Unhashable Тип: 'dict' - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь использовать модуль boto3 в PySpark (задание AWS Glue ETL) для загрузки фрейма данных в DynamoDB, но меня встречает ошибка:

Parameter validation failed: Invalid type for parameter Item, value: set(["{u'ecosystemName': u'animals', u'regionalCenter': u'center', u'dataExtractedTimestamp': u'20190502T13:12:11.111Z'}"]), type: <type 'set'>, valid types: <type 'dict'> Could not write to the Audit Table for regional center:

Может кто-нибудь помочь мне решить эту проблемуи объяснить, почему это происходит?Я хотел бы понять корень проблемы.

Вот мой текущий код.Обратите внимание, что в этом фрейме данных будет только одна строка.SQL, используемый ниже, является поддельными данными только для тестирования.

        try:
            timestamp_sql = """select
                                'animals' as ecosystemName,
                                '20190502T13:12:11.111Z' as dataExtractedTimestamp,
                        'center' as regionalCenter
                                """
            # Make a data frame from SQL
            audit_data_frame=spark.sql(timestamp_sql)

            # Write the joined dynamic frame out to a datasink
            dynamodb = boto3.resource('dynamodb','us-west-2')

            table = dynamodb.Table(args['DynamoDBTable2Name'])

            audit_data_frame_prep = json.loads(audit_data_frame.toJSON().first())

            print(audit_data_frame_prep)

            table.put_item( Item = { "{}".format(audit_data_frame_prep) } )

            print('Audit trail successfully written for ' + regional_center + '.')


        except Exception as e:
            print(e)
            print('Could not write to the Audit Table for regional center: ' + regional_center + '.')
            pass

1 Ответ

0 голосов
/ 03 мая 2019

Данг, снова 5-минутные правила ...

Это было в моем вызове put_item. У меня там были дополнительные скобки, что сделало JSON недействительным. Это изменение решает мою проблему:

table.put_item( Item = audit_data_frame_prep )
...