重复的键值违反了唯一约束 - 尝试从 dask 数据帧创建 sql 表时出现 postgres 错误

2023-11-21

继从this问题,当我尝试从具有多个分区的 dask.dataframe 创建 postgresql 表时,出现以下错误:

IntegrityError: (psycopg2.IntegrityError) duplicate key value violates unique constraint "pg_type_typname_nsp_index"
DETAIL:  Key (typname, typnamespace)=(test1, 2200) already exists.
 [SQL: '\nCREATE TABLE test1 (\n\t"A" BIGINT, \n\t"B" BIGINT, \n\t"C" BIGINT, \n\t"D" BIGINT, \n\t"E" BIGINT, \n\t"F" BIGINT, \n\t"G" BIGINT, \n\t"H" BIGINT, \n\t"I" BIGINT, \n\t"J" BIGINT, \n\tidx BIGINT\n)\n\n']

您可以使用以下代码重新创建错误:

import numpy as np
import dask.dataframe as dd
import dask
import pandas as pd
import sqlalchemy_utils as sqla_utils
import sqlalchemy as sqla
DATABASE_CONFIG = {
    'driver': '',
    'host': '',
    'user': '',
    'password': '',
    'port': 5432,
}
DBNAME = 'dask'
url = '{driver}://{user}:{password}@{host}:{port}/'.format(
        **DATABASE_CONFIG)
db_url = url.rstrip('/') + '/' + DBNAME
# create db if non-existent
if not sqla_utils.database_exists(db_url):
    print('Creating database \'{}\''.format(DBNAME))
    sqla_utils.create_database(db_url)
conn = sqla.create_engine(db_url)
# create pandas df with random numbers
df = pd.DataFrame(np.random.randint(0,40,size=(100, 10)), columns=list('ABCDEFGHIJ'))
# add index so that it can be used as primary key later on
df['idx'] = df.index
# create dask df
ddf = dd.from_pandas(df, npartitions=4)
# Write to psql
dto_sql = dask.delayed(pd.DataFrame.to_sql)
out = [dto_sql(d, 'test', db_url, if_exists='append', index=False, index_label='idx')
       for d in ddf.to_delayed()]
dask.compute(*out)

如果 npartitions 设置为 1,代码不会产生错误。所以我猜测这与 postgres 无法处理写入同一个 sql 表的并行请求有关...?我怎样才能解决这个问题?


我正在读书this。 当您使用并行处理创建/更新同一个表时,似乎会出现此错误。我明白这取决于this(如谷歌小组讨论中所解释的)。

所以我认为这取决于PostgreSQL它本身而不是来自连接驱动程序或用于多处理的模块。

好吧,实际上,我发现解决这个问题的唯一方法是创建足够大的块,以使写入过程比计算本身慢。 对于更大的块,这个错误不会增加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重复的键值违反了唯一约束 - 尝试从 dask 数据帧创建 sql 表时出现 postgres 错误 的相关文章

随机推荐