如果值包含来自&{39;

时间:2018-06-15 13:42:20

标签: yandex clickhouse

这是demo DDL:

CREATE TABLE X (
    eventdate        Date default toDate(now()),
    f1               String,
    f2               String,
    f3               String
) ENGINE = MergeTree(eventdate, (f1, f2, f3), 8192)

当我尝试导入数据时,clickhous失败并显示错误:

$echo "US,'Ewa Beach, Test" | clickhouse-client --database default --query "insert into X(f1, f2, f3) format CSV"

Code: 27. DB::Exception: Cannot parse input: expected , at end of
stream.: (at row 1)

这是我的Click house版本(如果我没有误会的话,是时候编写它的最新版本):

$ clickhouse-client --version
ClickHouse client version 1.1.54385.

问题是字段 f2 的值中的' 符号。 请问,是否有任何解决方法可以使其有效?

也许有一些选项强制使用双引号作为字符串分隔符,并将单引号视为普通符号而没有特殊含义?请,任何解决方案都欢迎。

我刚刚使用相同的值测试但是作为tsv,它可以工作。但不幸的是,我现在无法迁移到tsv。我需要找到csv的一些解决方法,使其与字段值中的signle引用一起使用。

P.S。

有趣的是,如果只留下两个字段,它会正确解析csv。

CREATE TABLE X (
    eventdate        Date default toDate(now()),
    f1               String,
    f2               String
) ENGINE = MergeTree(eventdate, (f1, f2), 8192)

以下查询工作:

$echo "US,'Ewa Beach" | clickhouse-client --database default --query "insert into X(f1, f2) format CSV"

以下是GitHub上的issue

2 个答案:

答案 0 :(得分:2)

我只是遇到了同样的问题。我已经创建了PR https://github.com/yandex/ClickHouse/pull/2574

您可以指定RewriteEngine On RewriteRule ^/connect/([0-9]+)$ connect.php?id=$1 [L]. 来解析以format_allow_csv_single_quote=0开头的字符串字段的csv数据

编辑:

现在已合并。

答案 1 :(得分:0)

您需要对这样的值使用双引号。

echo "US,\"'Ewa Beach\", Test" | clickhouse-client --host ch_srv --query "insert into X(f1, f2, f3) format CSV"

这有效。

:) select * from X format CSV;
SELECT *
FROM X 
FORMAT CSV
"2018-06-28","US","'Ewa Beach","Test"
:) select * from X;
SELECT *
FROM X 
┌──eventdate─┬─f1─┬─f2──────────┬─f3───┐
│ 2018-06-28 │ US │ \'Ewa Beach │ Test │
└────────────┴────┴─────────────┴──────┘