当前位置: 首页 > 面试题库 >

使用cqlsh复制非常大的Cassandra表时出现PicklingError

葛雪松
2023-03-14
问题内容

当我尝试使用以下命令将表复制到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它们来导入它们。


问题答案:

尽管我的数据集很小(一个表中有46行,另一表中有262行),但我还是用apache cassandra 3.9遇到了同样的问题。

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脚本,因此似乎只有在内存不足的情况下才会抬头。



 类似资料:
  • 插入entp(col1、col2、col3)值(“ABC”、“XYZ”、null) 谢了!

  • Cassandra CQLsh代表Cassandra CQL shell。 CQLsh指定如何使用Cassandra命令。 安装后,Cassandra提供了一个提示Cassandra查询语言shell(cqlsh)。 它有助于用户与之通信。 Cassandra命令在CQLsh上执行。 看起来像这样: 启动CQLsh: CQLsh提供了很多选项,在下表中是一些常用的命令: 选项 使用/作用 help

  • 我们有一个有7个节点的集群,我们使用datastax java驱动程序连接到集群。问题是我得到的是常量NoHostAvailableException,如下所示: 原因:com.datastax.driver.core.exceptions.noHostAvailableException:所有尝试查询的主机都失败了(尝试:/172.31.7.243:9042(com.datastax.drive

  • 问题内容: 我有一个三个节点的Cassandra集群,并且创建了一个表,该表具有2,000,000多行。 当我在cqlsh中执行此()查询时,出现以下错误: OperationTimedOut:错误= {},last_host = 192.168.1.2 当我运行计数功能以减少行数或限制为50,000时,它可以正常工作。 问题答案: count(*)实际上是翻页所有数据。因此,如果没有那么多行,将

  • 我是Java的新手,并试图了解集合。当我试图将一个ArrayList复制到另一个时,我遇到了异常。请在下面找到相同的代码。 异常:线程“main”中的异常 java.lang.IndexOutOfBounds异常:Source 不适合 java.util.Collections.copy(未知来源) at ArrayListTest.main(ArrayListTest.java:19) 如果我做

  • 我们的父工作流代码基本上是这样的(来自组织. 我们发现,在大多数情况下,父工作流工作者无法启动子工作流,并抛出上面的超时异常。它疯狂地重试,但从未成功,并一遍又一遍地打印超时异常。然而,有时我们非常幸运,它的工作。有时在活动工作器上它甚至更早就失败了,它抛出同样的异常。我们认为这是由于数据太大(大约5MB ),无法在超时时间内发送(从日志判断,我们猜测设置为2s)。如果我们用少量虚假数据调用< c