在带有JSONB列的表上,使用cassandra-loader / cassandra-unloader导出YugaByte DB的数据的正确方法是什么

时间:2019-08-26 09:07:11

标签: database distributed-database yugabyte-db

我尝试使用此处https://docs.yugabyte.com/v1.1/manage/data-migration/cassandra/bulk-export/

中描述的步骤

wget https://github.com/YugaByte/cassandra-loader/releases/download/v0.0.27-yb-2/cassandra-loader
wget https://github.com/YugaByte/cassandra-loader/releases/download/v0.0.27-yb-2/cassandra-unloader chmod a+x cassandra-unloader chmod a+x cassandra-loader

由于上述工具都是基于JVM的,因此安装时请打开jdk
sudo yum install java-1.8.0-openjdk

然后使用以下命令导出行:

% cd /home/yugabyte/entity % ./cassandra-unloader -schema "my_ksp.my_table(id,type,details)" -host <tserver-ip> -f export.csv -numThreads 3 Total rows retrieved: 10000

此处details是JSONB列。接下来,我在同一集群中创建一个新表my_table_new,并尝试将该数据加载到

./cassandra-loader -schema "my_ksp.my_table_new(id,type,details)" -host <tserver-ip> -f /home/yugabyte/entity -numThreads 3 -progressRate 200000 -numFutures 256 -rate 5000 -queryTimeout 65

但是出现以下形式的错误:
Row has different number of fields (12) than expected (3)

由于CSV文件中的JSONB数据也带有逗号,因此看起来像CSV文件中的默认定界符“,”引起了问题。

作为一种替代方法,尝试将-delim “\t”传递到cassandra-unloader中,但是似乎插入了两个字符“ \”和“ t”,而不是单标签字符。可以吗?

1 个答案:

答案 0 :(得分:1)

您是正确的,对于cassandra-unloader / cassandra-loader,默认分隔符(“,”)在Yugabyte DB中存在YCQL JSONB列时不起作用。

关于:

<<作为一种替代方法,尝试将-delim“ \ t”传递给cassandra-unloader,但是似乎插入了两个字符“ \”和“ t”,而不是单个制表符。那是预期的吗? >>

使用制表符作为分隔符应该可以正常工作。但是unix shell需要进行一些转义才能将“ \ t”正确地传递给程序。请参阅:https://superuser.com/questions/362235/how-do-i-enter-a-literal-tab-character-in-a-bash-shell

使用: -delim $'\t' 代替 -delim "\t"

例如,对于导出,请尝试:

./cassandra-unloader -schema "my_ksp.my_table(id,type,details)" -host <tserver-ip> -f export.csv -numThreads 3 -delim $'\t'

对于导入,请尝试:

./cassandra-loader -schema "my_ksp.my_table_new(id,type,details)" -host <tserver-ip> -f /home/yugabyte/entity -numThreads 3 -progressRate 200000 -numFutures 256 -rate 5000 -queryTimeout 65 -delim $'\t'