使用cqlsh复制非常大的cassandra表时的PicklingError

Rob*_*son 4 java cassandra cqlsh

当我尝试使用以下命令将表复制到cassandra时:

copy images from 'images.csv'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

'PicklingError: Can't pickle <class 'cqlshlib.copyutil.ImmutableDict'>: attribute lookup cqlshlib.copyutil.ImmutableDict failed'
Run Code Online (Sandbox Code Playgroud)

我已经成功导入了所有其他表,但是这个表不起作用.与此相关的唯一区别是它包含用于图像的大型二进制blob.

以下是csv文件中的示例行:

b267ba01-5420-4be5-b962-7e563dc245b0,,0x89504e...[large binary blob]...426082,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,pentium_e6600,01fa819e-3425-47ca-82aa-a3eec319a998,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,,,png,0
Run Code Online (Sandbox Code Playgroud)

以下是导致错误的文件:https: //www.dropbox.com/s/5mrl6nuwelpf3lz/images.csv?dl = 0

这是我的架构:

CREATE TABLE dealtech.images (
    id uuid PRIMARY KEY,
    attributes map<text, text>,
    data blob,
    height int,
    item_id uuid,
    name text,
    product_id uuid,
    scale double,
    seller_id uuid,
    text_bottom int,
    text_top int,
    type text,
    width int
)
Run Code Online (Sandbox Code Playgroud)

这些表是使用导出的cassandra 2.x,我目前正在使用cassandra 3.0.9它们导入它们.

小智 7

我遇到了与apache cassandra 3.9相同的问题,虽然我的数据集相当小(一个表中有46行,另一个表中有262行).

PicklingError: Can't pickle <class 'cqlshlib.copyutil.link'>: attribute lookup cqlshlib.copyutil.link failed

PicklingError: Can't pickle <class 'cqlshlib.copyutil.attribute'>: attribute lookup cqlshlib.copyutil.attribute failed

我定义的地点linkattribute类型.

COPY命令是一个.cql脚本的一部分,它是在Docker容器中运行的,只是它的设置过程.

我在几个地方看到人们在Windows上看到这个PicklingError(似乎与NTFS有关),但在这种情况下Docker容器使用的是Alpine Linux.

修复是将这些选项添加到我的COPY命令的末尾:

WITH MINBATCHSIZE=1 AND MAXBATCHSIZE=1 AND PAGESIZE=10;

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlshCopy.html

我没有看到PicklingError在本地运行这些包含COPY命令的.cql脚本,因此它似乎只是在低内存情况下才会出现问题.

相关问题: