当前位置: 首页 > 知识库问答 >
问题:

如何加载子层JSON文件到DynamoDB使用Boto3?

葛昱
2023-03-14

我试图用Python和Boto3将JSON文件加载到AWS dynamoDB中时遇到了问题,因为该文件具有子级别JSON。

例如,我有以下代码:

from __future__ import print_function # Python 2/3 compatibility
import boto3

dynamodb = boto3.resource('dynamodb', region_name='sa-east-1', aws_access_key_id='AWS ACCESS KEY', aws_secret_access_key='AWS SECRET KEY')
table = dynamodb.create_table(
    TableName='Movies',
    KeySchema=[
        {
            'AttributeName': 'year',
            'KeyType': 'HASH'  #Partition key
        },
        {
            'AttributeName': 'title',
            'KeyType': 'RANGE'  #Sort key
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'year',
            'AttributeType': 'N'
        },
        {
            'AttributeName': 'title',
            'AttributeType': 'S'
        },

    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 10,
        'WriteCapacityUnits': 10
    }
)

print("Table status:", table.table_status)

在这个布局中,我创建了一个表在AWS动态数据库,但只适用于JSON在一个层次的结构,如:

[
    {
        "year": 2013,
        "title": "Rush"
    }
]

但是,如果我想把一个JSON文件与子层?如何使用Boto3创建此表?以及如何输入文件?像这样:

[
    {
        "year": 2013,
        "title": "Rush",
        "info": {
            "directors": ["Ron Howard"],
            "release_date": "2013-09-02T00:00:00Z",
            "rating": 8.3,
            "genres": [
                "Action",
                "Biography",
                "Drama",
                "Sport"
            ],
            "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
            "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
            "rank": 2,
            "running_time_secs": 7380,
            "actors": [
                "Daniel Bruhl",
                "Chris Hemsworth",
                "Olivia Wilde"
            ]
        }
    }
]

我在网上阅读了这两个文档并搜索了一些教程,但我找不到如何做到这一点。这应该很简单,我知道我必须有办法做到这一点,但我还不能得到它。有人给我小费吗?

共有3个答案

费凯康
2023-03-14

如果以这种方式加载,它将处理嵌套的JSON结构,当您读取它时,您可以解析JSON并读取JSON中所需的属性

import boto3
import json

dynamodbclient=boto3.resource('dynamodb')
sample_table = dynamodbclient.Table('ec2metadata')

with open('/samplepath/spotec2interruptionevent.json', 'r') as myfile:
    data=myfile.read()

# parse file
obj = json.loads(data)

#instance_id and cluster_id is the Key in dynamodb table 

    response=sample_table.put_item(
                              Item={
                                  'instance_id': instanceId,
                                  'cluster_id': clusterId,
                                  'event':obj

                              }
                              )
丰赞
2023-03-14

实际上,我犯了一个简单的概念错误。对于DynamoDB,在创建表时,不需要声明表的每个属性。在这个阶段,您只需要说谁将是分区键和排序键(如果有)。如果输入的项具有更多属性,则可以在put_item()函数上声明,如:

from __future__ import print_function # Python 2/3 compatibility
import boto3
import json
import decimal

dynamodb = boto3.resource('dynamodb', region_name='sa-east-1', aws_access_key_id='AWS ACCESS KEY', aws_secret_access_key='AWS SECRET KEY')

table = dynamodb.Table('Movies')

title = "The Big New Movie"
year = 2015

response = table.put_item(
   Item={
        'year': year,
        'title': title,
        'info': {
            'plot':"Nothing happens at all.",
            'rating': decimal.Decimal(0)
        }
    }
)
熊锐进
2023-03-14

使用上面的示例,我认为您可以简单地使用table.update_item()方法

key = {'year': '2013'},{'title': 'Rush'}
attribute_name = 'info'
attribute_value = {} # build your info as a dictionary
attribute_value['directors'] = ['Ron Howard']
...

response = table.update_item(
    Key = key,
    UpdateExpression="SET " + attribute_name + " = :val",
    ExpressionAttributeValues={':val': attribute_value},
    ReturnValues="UPDATED_NEW"
)
 类似资料:
  • 我在Amazon DynamoDB中有多个表,JSON数据当前使用AWS CLI中提供的命令上传到表中-这很好。 但是,我只想使用Python Boto3,但无法使用外部数据文件作为输入执行Boto请求。我设想如果有一个Boto3脚本,它会像下面所示的那样,但是我还没有找到它的文档/示例。 示例(伪代码) 参考:http://docs.aws.amazon.com/amazondynamodb/l

  • 问题内容: 我想保留一个JSON文档来存储一些简单的数据,并且我需要此文档并在调用中使用JSON对象,以便可以使用它。这不是电话。我的意思是应该用于开发,但我确实希望在构建时编译文件,这与API 的实际调用不同,API的内容是动态的。 问题答案: 最简单的方法是为此使用requirejs json插件,这将使您也可以将文件包括在构建中。 https://github.com/millermedei

  • 问题内容: 我正在使用JSON传输数据。 我需要在HTML页面中使用Ajax读取仅在脚本中包含一个JSON对象的文件吗? 我是否也需要jQuery,或者是否可以使用Ajax加载该JSON文件? 在不同的浏览器上是否有所不同? 问题答案: 您不需要任何库,香草javascript中的所有内容均可用,以获取json文件并进行解析:

  • 我想加载(要求)一个包含json模式的文件夹,这些模式具有基于其文件的引用。 换句话说,我有 并在同一文件夹中的另一个文件中: 这些模式在sperate文件中,现在应该加载到JS中,以便针对json对象进行验证。但是,文件夹内的引用应该仍然有效。 这就是为什么我的问题是,是否以及如何能够加载一个装满json文件的文件夹,而不需要中断引用。 这个库将使用这些模式来验证json对象:https://g

  • 我想加载一个文件从hdfs到我的本地服务器使用puty,然后重命名,并再次加载回hdfs。我怎么能这样做呢?我需要它的Unix命令。任何帮助将不胜感激。

  • 努力将json从URL上的文件(myData.json)加载到对象中,以便访问属性值。 --数据立即加载,我在应用程序中非常需要它。 -我将访问整个应用程序中的数据,而不仅仅是数据加载后立即发生的一个函数的一部分。 --我已确保文件中的数据格式正确。 按照jQuery API上的示例,我不应该做一些简单的事情,比如: 警报(jqxhr.my财产); 得到价值吗?我错过了哪一步?我试过做评估和其他类