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

时间:2017-05-16 15:08:30

标签: java cassandra cqlsh

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

copy images from 'images.csv'

我收到错误:

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

我已经成功导入了所有其他表,但是这个表不起作用。与此相关的唯一区别是它包含用于图像的大型二进制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

这是导致错误的文件: 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
)

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

1 个答案:

答案 0 :(得分:5)

我遇到了与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脚本,所以这似乎是一个只会让它处于低内存状态的问题。

相关问题: