使用put_item dynamodb

时间:2019-05-28 14:50:19

标签: amazon-dynamodb boto3 aws-glue

我想将数据框中的数据写入dynamodb表

item = {}
for row in datasource_archived_df_join_repartition.rdd.collect():
    item['x'] = row.x
    item['y'] = row.y
    client.put_item( TableName='tryfail',
    Item=item) 

但我收到此错误 参数Item.x的无效类型,值:478.2,类型:'<'type'float'>',有效类型:'<'type'dict'>' 参数Item.y的无效类型,值:696-18C 12,类型:'<'type'unicode'>',有效类型:'<'type'dict'>'

2 个答案:

答案 0 :(得分:0)

该错误消息表明您使用的是错误的类型,当您将值分配给item['x']item[y]时,您似乎需要使用dictionary。例如

item['x'] = {'value': row.x}
item['y'] = {'value': row.y}

答案 1 :(得分:0)

老问题,但它仍然在搜索中出现并没有得到正确回答,所以我们开始吧。

将项目放入 DynamoDB 表时,它必须是特定嵌套形式的字典,向数据库引擎指示每个属性值的数据类型。表格如下所示。考虑这个的方法是 AttributeValue 不是一个裸变量值,而是该值及其类型的组合。例如,下面 AlbumTitle 属性的 AttributeValue 是 dict {'S': 'Somewhat Famous'},其中 'S' 表示字符串类型。

response = client.put_item(
    TableName='Music',
    Item={
        'AlbumTitle': { # <-------------- Attribute
            'S': 'Somewhat Famous', # <-- Attribute Value with type string ('S')
        },
        'Artist': {
            'S': 'No One You Know',
        },
        'SongTitle': {
            'S': 'Call Me Today',
        },
        'Year': {
            'N': '2021' # <----------- Note that numeric values are supplied as strings
        }
    }
)

在你的情况下(假设 x 和 y 是数字)你可能想要这样的东西:

for row in datasource_archived_df_join_repartition.rdd.collect():
    item = {
        'x': {'N': str(row.x)},
        'y': {'N': str(row.y)}
    }
    client.put_item( TableName='tryfail', Item=item) 

这里有两点需要注意:第一,每个项目对应一行,所以如果你把项目放在一个循环中,你必须在每次迭代时实例化一个新的。其次,关于将数字 x 和 y 转换为字符串,DynamoDB 文档解释说 AttributeValue dict 要求这样做的原因是“为了最大限度地跨语言和库的兼容性。但是,DynamoDB 将它们视为数学运算的数字类型属性。”有关 DynamoDB 类型系统的更完整文档,请查看 this 或阅读 Boto3 文档 here,因为您使用的是 Python。