我正在我的Mac上(使用Oracle jdk1.7.0_55和Mac OS X Yosemite)搭建Cassandra、Apache Spark和Flume的演示环境。这个环境将作为一个新分析平台的概念验证,因此我需要在我的Cassandra数据库中添加一些测试数据。我正在使用Cassandra 2.0.8。
我在Excel中创建了一些演示数据,并将其导出为CSV文件。结构如下:
ProcessUUID;ProcessID;ProcessNumber;ProcessName;ProcessStartTime;ProcessStartTimeUUID;ProcessEndTime;ProcessEndTimeUUID;ProcessStatus;Orderer;VorgangsNummer;VehicleID;FIN;Reference;ReferenceType
0F0D1498-D149-4FCC-87C9-F12783FDF769;AbmeldungKl‰rfall;1;Abmeldung Kl‰rfall;2011-02-03 04:05+0000;;2011-02-17 04:05+0000;;Finished;SIXT;4278;A-XA 1;WAU2345CX67890876;KLA-BR4278;internal
接下来我使用cqlsh创建了一个键空间和一个列族:
CREATE KEYSPACE dadcargate
WITH REPLICATAION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
use dadcargate;
CREATE COLUMNFAMILY Process (
ProcessUUID uuid, ProcessID varchar, ProcessNumber bigint, ProcessName varchar,
ProcessStartTime timestamp, ProcessStartTimeUUID timeuuid, ProcessEndTime timestamp,
ProcessEndTimeUUID timeuuid, ProcessStatus varchar, Orderer varchar,
VorgangsNummer varchar, VehicleID varchar, FIN varchar, Reference varchar,
ReferenceType varchar,
PRIMARY KEY (ProcessUUID))
WITH COMMENT='A process is like a bracket around multiple process steps';
列族名称及其中的所有列均使用小写字母创建 - 这也是某一天需要调查的问题,但目前并不那么重要。
现在我将使用以下方式将具有约1600个条目的CSV文件导入名为process
的表格中:
cqlsh:dadcargate> COPY process (processuuid, processid, processnumber, processname,
processstarttime, processendtime, processstatus, orderer, vorgangsnummer, vehicleid,
fin, reference, referencetype)
FROM 'Process_BulkData.csv' WITH DELIMITER = ';' AND HEADER = TRUE;
它会显示以下错误:
Record #0 (line 1) has the wrong number of fields (15 instead of 13).
0 rows imported in 0.050 seconds.
这基本上是正确的,因为我的 cvs-export 中没有 timeUUID 字段。
如果我尝试不带显式列名执行 COPY 命令,就像这样(考虑到实际上缺少两个字段):
cqlsh:dadcargate> COPY process from 'Process_BulkData.csv'
WITH DELIMITER = ';' AND HEADER = TRUE;
我遇到了另一个错误:
Bad Request: Input length = 1
Aborting import at record #0 (line 1). Previously-inserted values still present.
0 rows imported in 0.009 seconds.
嗯,有点奇怪,但好吧。也许COPY命令不喜欢有两个字段缺失的事实。从结构上看,我仍然觉得这很奇怪,因为缺失的字段当然存在,只是为空。
我还有另一种尝试:我在Excel中删除了缺失的列,将文件再次导出为CSV格式,并尝试在我的CSV文件中使用明确的列名称而无需头行来进行导入,如下所示:
cqlsh:dadcargate> COPY process (processuuid, processid, processnumber, processname,
processstarttime, processendtime, processstatus, orderer, vorgangsnummer, vehicleid,
fin, reference, referencetype)
FROM 'Process_BulkData-2.csv' WITH DELIMITER = ';' AND HEADER = TRUE;
I get this error:
Bad Request: Input length = 1
Aborting import at record #0 (line 1). Previously-inserted values still present.
0 rows imported in 0.034 seconds.
有人能告诉我在这里做错了什么吗?根据复制命令的文档,我设置命令的方式应该至少适用于其中两个。但是,显然我在这里漏掉了一些重要的东西。
COPY
命令中有AND HEADER = TRUE
。 - Aaron错误请求:输入长度=1中止导入记录#0(第1行)。 先前插入的值仍然存在。
- siliconchris