monetdb 批量复制 |使用 python 批量复制

Posted

技术标签:

【中文标题】monetdb 批量复制 |使用 python 批量复制【英文标题】:monetdb bulk copy | bulk copy with python 【发布时间】:2015-04-10 08:01:34 【问题描述】:

我面临在 monetdb 表中批量导入的文件加载问题。下面提供了重新创建问题的详细信息:

我已经安装了 monetdb 版本 11.19.9,monetdb 的 python 客户端也是 11.19.9。

创建了 dbform,它工作正常,我已经连接到 monetdb shell 并通过 python api。

现在正在尝试导入转储的 CSV 文件,csv 文件的内容如下所示:

44444444|ALI
55555555|JAFFRI

表格架构定义为:*“表格已经有5000万行,而csv只有两行”

CREATE TABLE "voc"."test" (
    "id"   INTEGER,
    "data" VARCHAR(30)
);
用户名和数据库名都是“voc”

用于导入文件的命令如下。

root@monetdb:~# mclient -u voc -d voc -s  "COPY INTO test FROM STDIN" - < test.csv
password:
NULL byte in input
root@monetdb:~# mclient -u voc -d voc -s  "COPY INTO test FROM STDIN NULL AS ''" - < test.csv
password:
NULL byte in input

抛出错误“输入中的NULL字节”并且没有任何内容添加到表中。

对于 Python,我尝试过使用以下命令:

import monetdb.sql
connection = monetdb.sql.connect(username="voc", password="voc", hostname="localhost", database="voc")
cursor = connection.cursor()
cursor.execute("COPY INTO test FROM 'test.csv'")
connection.commit()

此代码抛出 Perm 异常:

COPY INTO: insufficient privileges: COPY INTO from file(s) requires database administrator rights, use 'COPY INTO "test" FROM STDIN' instead

现在我没有找到任何 Python 代码与 STDIN 一起使用的示例,Monetdb 游标不提供 copy_from,这与您可以单独传递文件的 PostgreSQL 不同。 python有什么解决办法吗?

操作系统?

uname -a
Linux monetdb 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

*** Python 示例在用户 monetdb 上运行良好,但对于终端“输入中的 NULL 字节”仍然存在。

【问题讨论】:

您能分享您要导入的文件吗? 我已经分享了相关文件的内容。我还需要共享实际文件吗? 【参考方案1】:
mclient -u voc -d voc -s  "COPY INTO test FROM STDIN" - < test.csv

对我来说很好。 NULL byte in input 错误表示您尝试加载的文件有问题。

关于另一个问题(从 Python 调用 COPY INTO),错误消息也很清楚。尝试以monetdb 用户身份连接。

同样有效的是在 COPY INTO 命令之后内联要导入的 CSV 数据。示例(Python):

cursor.execute("COPY 2 RECORDS INTO test FROM STDIN;\n44444444|AL\n55555555|JAFFRI")

这里的缺点是需要指定要导入的记录数。

【讨论】:

与用户 monetdb 连接工作正常,但如何为其他使用 STDIN 的用户使用 python? 即使我可以指定记录数,上传100M行文件如何可行? 使用用户 monetdb 从文件加载【参考方案2】:

我创建了一个简单的表(create table dept (dept_id integer, dept_nm varchar(25)) 并尝试使用 Python 从文件中插入记录并出现错误。所有执行语句都给我相同的错误消息:

connection = monetdb.sql.connect(username="monetdb", password="monetdb", hostname="10.81.102.71", port=2234, database="demo")
cursor = connection.cursor()
cursor.execute("COPY INTO dept FROM 'C:\AWS\did.csv' USING DELIMITERS;")
cursor.execute("COPY INTO dept FROM 'C:\AWS\did.csv' USING DELIMITERS")
cursor.execute("COPY INTO dept FROM STDIN;\n44444444,'AL'\n55555555,'JAFFRI'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Q1\AppData\Local\Continuum\Anaconda2\lib\site-packages\monetdb\sql\cursors.py", line 175, in execute
    block = self.connection.execute(query)
  File "C:\Users\Q1\AppData\Local\Continuum\Anaconda2\lib\site-packages\monetdb\sql\connections.py", line 138, in execute
    return self.command('s' + query + ';')
  File "C:\Users\Q1\AppData\Local\Continuum\Anaconda2\lib\site-packages\monetdb\sql\connections.py", line 143, in command
    return self.mapi.cmd(command)
  File "C:\Users\Q1\AppData\Local\Continuum\Anaconda2\lib\site-packages\monetdb\mapi.py", line 202, in cmd
    raise OperationalError(response[1:])monetdb.exceptions.OperationalError: 25005!current transaction is aborted (please ROLLBACK)

【讨论】:

comment 前 2 个插入,使用 |管道作为分隔符而不是“,”

以上是关于monetdb 批量复制 |使用 python 批量复制的主要内容,如果未能解决你的问题,请参考以下文章

使用主键约束在 monetdb 中批量加载

Windows批处理脚本实现批量复制文件并重命名

批量复制及执行命令shell脚本

MonetDB 如何使用索引?

在 MonetDB 中使用 WITH

从 MonetdbLite C API 使用 monetdb_append