当我尝试使用以下命令将表复制到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
导入它们。
答案 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
link
和attribute
是我定义的类型。
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脚本,所以这似乎是一个只会让它处于低内存状态的问题。
相关问题: