我正在使用Cassandra 3.9。
假设我有一个简单的表,声明如下:
CREATE KEYSPACE data WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
CREATE TABLE data.test (
field1 text,
time timestamp,
field2 text,
field3 text,
PRIMARY KEY (field1, time, field3)
);
使用CQL,我要插入csv文件中的内容。这是文件的输入示例:
field1,time,field2,field3
"A",2018-01-01T19:55:00.000Z,0.001,"AAA"
"B",2018-01-01T19:55:00.000Z,0.5,"BBB"
"C",2018-01-01T19:55:00.000Z,0.081,"CCC"
"D",2018-01-01T19:55:00.000Z,0.11,"DDD"
"E",2018-01-01T19:55:00.000Z,0.22,"EEE"
然后使用命令COPY将数据插入表中:
COPY data.test FROM 'FILEPATH\file.csv' WITH HEADER = TRUE ;
数据已插入到我的表中,但列“ field2”和“ field3”的内容却被反转。
cqlsh:data> select * from test;
field1 | time | field3 | field2
--------+---------------------------------+--------+--------
C | 2018-01-01 04:00:00.000000+0000 | 0.081 | CCC
B | 2018-01-01 04:00:00.000000+0000 | 0.5 | BBB
A | 2018-01-01 04:00:00.000000+0000 | 0.001 | AAA
E | 2018-01-01 04:00:00.000000+0000 | 0.22 | EEE
D | 2018-01-01 04:00:00.000000+0000 | 0.11 | DDD
(5 rows)
我找不到为什么会有这种(奇怪的)行为。 CSV文件上的标题正确无误,应该足以正确插入表格中。
编辑:
在Jan回答之后,我这样修改了我的插入命令:
COPY data.test (field1,time,field3,field2) FROM 'FILEPATH\file.csv' WITH HEADER = TRUE ;
但这给了我相同的结果。另一方面,当我按列名在文件中的顺序(而不是主键的顺序)指定列名时,它给了我正确的结果:
cqlsh:data> COPY data.test (field1,time,field2,field3) FROM 'FILEPATH\file.csv' WITH HEADER = TRUE ;
cqlsh:data> select * from test;
field1 | time | field3 | field2
--------+---------------------------------+--------+--------
C | 2018-01-01 04:00:00.000000+0000 | CCC | 0.081
B | 2018-01-01 04:00:00.000000+0000 | BBB | 0.5
A | 2018-01-01 04:00:00.000000+0000 | AAA | 0.001
E | 2018-01-01 04:00:00.000000+0000 | EEE | 0.22
D | 2018-01-01 04:00:00.000000+0000 | DDD | 0.11
(5 rows)
答案 0 :(得分:2)
当前,HEADER = true唯一要做的就是告诉cqlsh是否忽略第一行。
关于datastax的文档在这方面似乎有点误导(我会让他们知道),但是在cqlsh中运行help COPY将给出以下输出:
HEADER=false - whether to ignore the first line
目前有一个改进它可以从此标头读取的标签,可以在here中找到。