为什么使用pycassa导出的Cassandra表返回的行数比通过CQL SELECT导出的少
我的任务是将Cassandra安装的数百万条记录从2.1版升级到3.11版(最新版本)。使问题复杂化的是,misencoded UTF8值存在一些内部格式问题 我通过将每个验证器更改为字节类型修复了UTF8问题,因此至少现在所有记录都可见(即不触发格式错误)。但我在将数据导出到CSV文件时遇到问题:为什么使用pycassa导出的Cassandra表返回的行数比通过CQL SELECT导出的少,cassandra,cqlsh,pycassa,Cassandra,Cqlsh,Pycassa,我的任务是将Cassandra安装的数百万条记录从2.1版升级到3.11版(最新版本)。使问题复杂化的是,misencoded UTF8值存在一些内部格式问题 我通过将每个验证器更改为字节类型修复了UTF8问题,因此至少现在所有记录都可见(即不触发格式错误)。但我在将数据导出到CSV文件时遇到问题: CQL SELECT命令,无论是在cqlsh中还是在通过DataStax驱动程序的脚本中,都是显而易见的解决方案。但是SELECT语句的默认限制是10000,我已经读到,将其更改为更大的值将导致各种
CREATE TABLE app2_uat.complete (
key blob,
column1 blob,
value blob,
PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE
AND CLUSTERING ORDER BY (column1 ASC)
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND dclocal_read_repair_chance = 0.0
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = 'NONE';
我尝试的dsbulk命令是:
dsbulk unload -u cassandra -p cassandra -h '["172.31.44.160"]' -query "SELECT * from app2_uat.complete;"
我对这种方法的第一个问题是,它使用了坏的旧CQL SELECT和它的限制,我不能任意增加或消除-选择是出于这个原因
我的第二个问题是它以乱七八糟的格式输出blob,例如:
key,column1,value
MTU4,Yy0xNTgyZmYxYzkwMGYxNzQ0ZmFhOWVlOGRkZWQxOTM2OGI3MA==,IA==
MTU4,Yy0xNThhMmYyNDliMWJhOWI0YWVmOTc4OTM5ZjE0NzZmNGFjNQ==,IA==
MTU4,Yy0xNThjODJmZGYyZDIyMjk0YWFjODBhNjQ5Y2NiZGZhMDk5Mg==,IA==
OTQ=,Yy05NDRhYjYyM2YxODMzNDQwM2M5MmNmOTc0ZWJkNjRiZmY0,IA==
MTE3,Yy0xMTc3OTEzNWE0OTNlYjU0YzU1YTNjMTdhNzc5YTk2ZTM1ZQ==,
MTE3,Yy0xMTdiYzQ2ZmNhNTc1ZmQ0MDk3YmQ0NTYxODdhMzQxYTQ1Ng==,
NTg=,Yy01ODZmZmVhNTczYjRjNzQwNGJiYjFjNzM2MzMxNTM5Mzhj,
NTg=,Yy01ODhjMmI3ZWJjNWYwNjQ1OGQ5NGMwNDljOWI1OGRiYjk0,
我无法将其与CQL(和我的pycassa脚本)生成的十六进制输出联系起来:
key | column1 | value
----------+------------------------------------------------------------------------------+-------
0x36 | 0x632d3632373566376561633136323131653338343730303230303839646531306266 | 0x20
0x36 | 0x632d3633383563356632633136323131653339636363303230303839646531306266 | 0x20
0x36 | 0x632d3634363737643663633136323131653362346135303230303839646531306266 | 0x20
0x36 | 0x632d3635353933303361633136323131653361326137303230303839646531306266 | 0x20
0x36 | 0x632d3636326264653836633136323131653362323363303230303839646531306266 | 0x20
0x36 | 0x632d3637306662343934633136323131653361616439303230303839646531306266 | 0x20
0x36 | 0x632d3637663931376230633136323131653361623963303230303839646531306266 | 0x20
0x36 | 0x632d3638636164373061633136323131653339396134303230303839646531306266 | 0x20
你能想出pycassa为什么不输出在CQL中可见的记录块的任何原因吗?DSBulk必须工作得很好-你能把你正在使用的表和DSBulk命令的模式放进去吗?谢谢Alex,我已经添加了你要求的详细信息。DSBulk将二进制数据编码为base64,以使它们在CSV文件中安全…好的,考虑到某些字符串末尾的“=”s,我认为它可能是base64。这是可以管理的。但是选择限制问题呢?如果dsulk在10000条记录后停止(或选择任何限制,低于2000000条),它将毫无用处。我要把整张桌子都取出来!它应该卸载所有数据-如果不是,那么您应该在日志中看到错误。。。DSBulk确实针对数据加载/卸载进行了大量优化—它将比自编代码好得多—在不重载节点的情况下编写有效的数据卸载并非易事,尤其是对于2.1。。。另外,如果卸载期间DSBulk超时,您可以尝试指定
--schema.splits
,以将令牌范围分成更小的部分
key | column1 | value
----------+------------------------------------------------------------------------------+-------
0x36 | 0x632d3632373566376561633136323131653338343730303230303839646531306266 | 0x20
0x36 | 0x632d3633383563356632633136323131653339636363303230303839646531306266 | 0x20
0x36 | 0x632d3634363737643663633136323131653362346135303230303839646531306266 | 0x20
0x36 | 0x632d3635353933303361633136323131653361326137303230303839646531306266 | 0x20
0x36 | 0x632d3636326264653836633136323131653362323363303230303839646531306266 | 0x20
0x36 | 0x632d3637306662343934633136323131653361616439303230303839646531306266 | 0x20
0x36 | 0x632d3637663931376230633136323131653361623963303230303839646531306266 | 0x20
0x36 | 0x632d3638636164373061633136323131653339396134303230303839646531306266 | 0x20