将一个 pandas 表加载到 DynamoDB

3

我正在尝试将一个大的Pandas表格加载到dynamoDB中。

我已经尝试了以下for循环方法:

for k in range(1000):
    trans = {}
    trans['Director'] = DL_dt['director_name'][k]
    trans['Language'] = DL_dt['original_language'][k]
    print("add :", DL_dt['director_name'][k] , DL_dt['original_language'][k])
    table.put_item(Item=trans)

它可以工作,但是非常耗时。 有没有更快的加载方法?(类似于sql数据库的to_sql

我找到了batchwriteitem函数,但我不确定它是否有效,也不知道如何使用它。

非常感谢。

3个回答

4
您可以遍历数据帧中的行,将每一行转换为JSON格式,然后使用json.loads将其转换为字典,这还可以避免numpy数据类型错误。
您可以尝试以下操作:
import json
from decimal import Decimal
DL_dt = DL_dt.rename(columns={
    'director_name': 'Director',
    'original_language': 'Language'
})
with table.batch_writer() as batch:
    for index, row in DL_dt.iterrows():
        batch.put_item(json.loads(row.to_json(), parse_float=Decimal))

3

我使用aws wrangler完成了这个操作。这是一个相当简单的过程,唯一棘手的部分是处理pandas浮点数,因此在加载数据之前,我将它们转换为十进制。

import awswrangler as wr

def float_to_decimal(num):
    return Decimal(str(num))

def pandas_to_dynamodb(df):
    df = df.fillna(0)
    # convert any floats to decimals
    for i in df.columns:
        datatype = df[i].dtype
        if datatype == 'float64':
            df[i] = df[i].apply(float_to_decimal)
    # write to dynamodb
    wr.dynamodb.put_df(df=df, table_name='table-name')

pandas_to_dynamodb(df)

你需要优化这段代码,df = df.fillna(0) 应该放在 for 循环之前。 - Cristián Vargas Acevedo
看得真仔细,我已经更新了。谢谢! - Wev

0

批量编写文档这里

尝试这个:

with table.batch_writer() as batch:
    for k in range(1000):
        trans = {}
        trans['Director'] = DL_dt['director_name'][k]
        trans['Language'] = DL_dt['original_language'][k]
        print("add :", DL_dt['director_name'][k] , DL_dt['original_language'][k])
        batch.put_item(trans))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接