我想将数据框中的数据写入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'>'
答案 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。