【问题标题】:Controlling string unescaping in Clickhouse?在 Clickhouse 中控制字符串转义?
【发布时间】:2020-06-24 23:09:29
【问题描述】:

我正在尝试将 JSON 数据从 Kafka 加载到 Clickhouse,其中 JSON 包含一些转义序列。例如:

:) SELECT JSONExtractRaw('{"message": "Hello \"to\" you!"}', 'message')

SELECT JSONExtractRaw('{"message": "Hello "to" you!"}', 'message')

┌─JSONExtractRaw('{"message": "Hello "to" you!"}', 'message')─┐
│ "Hello "                                                    │
└─────────────────────────────────────────────────────────────┘

似乎在调用 JSONExtractRaw 之前,输入字符串未转义,这会产生无效的 JSON。这个最小的例子似乎可以重现这种转义:

:) SELECT 'Hello \"there\"'

SELECT 'Hello "there"'

┌─'Hello "there"'─┐
│ Hello "there"   │
└─────────────────┘

我想知道是否可以保留输入的原始(转义)表示。

谢谢!

【问题讨论】:

    标签: clickhouse


    【解决方案1】:
    SELECT '{"message": "Hello \\"to\\" you!"}'
    
    ┌─'{"message": "Hello \\"to\\" you!"}'─┐
    │ {"message": "Hello \"to\" you!"}     │
    └──────────────────────────────────────┘
    

    【讨论】:

    • 这似乎并没有解决 Clickhouse 对字符串进行转义的问题。假设您无法控制输入字符串,则此解决方案不适用。问题是是否可以接收输入字符串而不对其应用转义。
    • 假设你需要给手机充电,但你需要在没有充电器的情况下直接从电源插座上充电。
    【解决方案2】:

    让我们在不使用 CLI 的情况下测试您的案例,以模拟由外部数据填充的表格:

    echo '{"message": "Hello \"to\" you!"}' | clickhouse-client \
        --password 12345 \
        --query="INSERT INTO test.json_001 SELECT json FROM input('json String') FORMAT CSV"
    
    create database test;    
    create table test.json_001 (json String) Engine=Memory; 
    

    获取所需数据:

    clickhouse-client \
        --password 12345 \
        --query="SELECT JSONExtractRaw(json, 'message'), JSONExtractString(json, 'message') FROM test.json_001"
    
    # result:
    # "Hello \\"to\\" you!"   Hello "to" you!
    
    SELECT
        JSONExtractRaw(json, 'message'),
        JSONExtractString(json, 'message')
    FROM test.json_001
    
    /* result
    ┌─JSONExtractRaw(json, 'message')─┬─JSONExtractString(json, 'message')─┐
    │ "Hello \"to\" you!"             │ Hello "to" you!                    │
    └─────────────────────────────────┴────────────────────────────────────┘
    */
    

    它可以正常工作。我没有发现任何问题。

    【讨论】:

    • 感谢您的回复!尝试运行其中一个命令时遇到问题... $ echo '{"message": "Hello \"to\" you!"}' | clickhouse-client --host clickhouse --query="INSERT INTO test.json_001 SELECT json FROM input('json String') FORMAT CSV" Code: 62. DB::Exception: Syntax error: failed at position 65: FORMAT CSV.预期之一:表、表函数、子查询或连接表列表、AS、SETTINGS、FINAL、SAMPLE、JOIN、INNER、PREWHERE、WHERE、WITH、HAVING、LIMIT、别名、UNION ALL、标识符、ORDER BY、数组连接, 左数组连接, 数组连接, GROUP BY
    • 您使用什么版本的 ClickHouse?从 2019 年 10 月 1 日开始,它看起来不是旧的 19.15.2.2input-table 函数被添加到这个版本(clickhouse.tech/docs/en/changelog/…)。
    • 我在 20.X 上,所以我认为它会可用。无论如何,我能够解决我的问题(你是对的,没有任何问题)。我的问题是由于 Clickhouse 隐式转义了字符串序列或 TSV。我求助于将数据加载为 CSV(带有空分隔符),由于某种原因,它不会对数据进行转义。然后我可以在数据上运行 JSONExtractX。
    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2021-04-29
    相关资源
    最近更新 更多