我尝试了多种方法将数据从数据帧插入数据库,但没有一种方法能够快速完成。操作耗时长达2天至3天,并最终出现超时错误。
以下是我尝试过的几种方法:
首先,我将数据帧转换为字典,然后尝试上传到数据库。以下是数据的一个示例片段:注意,我分享的是20行数据,但实际上我有大量的数据。
conn = psycopg2.connect(
host='redshift-####-dev.)00000.us-east-1.redshift.amazonaws.com',
database='*****',
user='****',
password='*****',
port='5439'
)
print("成功连接到 RedShift Dev")
cur = conn.cursor ()
df_dic =[{'case_id': 69370, 'column_name': 'subject', 'split_text': 'working', 'split_text_cnt': 1, 'load_ts': '2023-12-15'}, {'case_id': 69370, 'column_name': 'subject', 'split_text': 'scenes', 'split_text_cnt': 1, 'load_ts': '2023-12-15'}, ...(省略大量字典条目)]
sql = "INSERT INTO odey.sfc_ca_sit_di (case_id,column_name,split_text,split_text_cnt,load_ts) VALUES (%(case_id)s,%(column_name)s,%(split_text)s,%(split_text_cnt)s,%(load_ts)s)"
cur.executemany(sql, df_dic)
conn.commit()
在这个方法中,我使用了executemany函数处理字典列表。
第二种方法是,我将数据帧转换为元组序列并执行查询,其中final_out是数据帧。
sql = "INSERT INTO sey.sfdse_sp_di (case_id,column_name,split_text,split_text_cnt,load_ts) VALUES (%s,%s,%s,%s,%s)"
for row in final_out.values.tolist():
cur.execute(sql, tuple(row))
#print(tuple(row))
conn.commit()
这两种方法都需要数天时间才能完成插入操作。
请问有人能否建议一种更快的插入大量数据的方法?数据量大约有60万条记录。