Clickhouse 无法解析输入:预期 \t 之前

Posted

技术标签:

【中文标题】Clickhouse 无法解析输入:预期 \\t 之前【英文标题】:Clickhouse Cannot parse input: expected \t beforeClickhouse 无法解析输入:预期 \t 之前 【发布时间】:2021-04-23 13:06:07 【问题描述】:

我正在尝试使用 yandex logs api (https://github.com/yndx-metrika/logs_api_integration) 将数据插入到 clickhouse 它使用requests 作为库来发送请求。

我的错误是:

Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected \t before: \n33\t55\t2017-05-05\n33\t55\t2017-05-05\n33\t55\t2017-05-05\n33\t55\t2017-05-05 (version 19.16.4.12)

当我发送请求时,我的查询参数是:

u'query': u'INSERT INTO db.table FORMAT TabSeparatedWithNames ', u'input_format_allow_errors_num': 99999, u'input_format_tsv_empty_as_default': 1, u'input_format_allow_errors_ratio': 1

引擎是 MergeTree()

列不能为空

我的数据是

ClientID  CounterID  Date
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05
55  33  2017-05-05

【问题讨论】:

【参考方案1】:

使用TabSeparatedWithNames时需要传递表头(列名):

import requests

CH_USER = 'default'
CH_PASSWORD = ''
SSL_VERIFY = False

host = 'http://localhost:8123'
db = 'db'
table = 'table'

content = 'ClientID\tCounterID\tDate' \
          '\n33\t55\t2017-05-05' \
          '\n33\t55\t2017-05-05' \
          '\n33\t55\t2017-05-05' \
          '\n33\t55\t2017-05-05' \
          '\n33\t55\t2017-05-05'
content = content.encode('utf-8')
query_dict = 
    'query': 'INSERT INTO ' + db + '.' + table + ' FORMAT TabSeparatedWithNames '


r = requests.post(host, data=content, params=query_dict, auth=(CH_USER, CH_PASSWORD), verify=SSL_VERIFY)

print(r.text)

测试表架构:

CREATE TABLE table
(
    `ClientID` Int32,
    `CounterID` Int32,
    `Date` date
)
ENGINE = MergeTree
ORDER BY Date

【讨论】:

【参考方案2】:

确保您尝试插入的列数(以及列名/类型本身)在目标表中相同

【讨论】:

以上是关于Clickhouse 无法解析输入:预期 \t 之前的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse:runningAccumulate() 不像我预期的那样工作

R,ClickHouse:预期:FixedString(34)。得到:UInt64:处理时

Clickhouse--数据输入输出格式实战

为何如此之快?ClickHouse的核心特性及架构

为何如此之快?ClickHouse的核心特性及架构

大数据ClickHouse:MergeTree系列表引擎之MergeTree(重点掌握)