Cassandra CQL:CSV插入反转列

时间:2018-08-21 12:37:32

标签: cassandra cql cassandra-3.0

我正在使用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)

1 个答案:

答案 0 :(得分:2)

当前,HEADER = true唯一要做的就是告诉cqlsh是否忽略第一行。

关于datastax的文档在这方面似乎有点误导(我会让他们知道),但是在cqlsh中运行help COPY将给出以下输出:

HEADER=false            - whether to ignore the first line

目前有一个改进它可以从此标头读取的标签,可以在here中找到。