V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wangshouh
V2EX  ›  问与答

使用 clickhouse 遇到的一个奇怪问题

  •  
  •   wangshouh · 2023-02-07 21:11:12 +08:00 · 831 次点击
    这是一个创建于 659 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用 Clickhouse 进行 JSON 数据清洗,代码如下:

    SELECT *
    FROM
    (
    WITH JSONExtract(
    	field, 
    	'Tuple(transactions Nested(hash String, blockNumber String, value String, logs Nested(address String, data String, topics Array(String))))'
    ) AS parsed_json
    SELECT 
    	untuple(arrayJoin(tupleElement(parsed_json, 'transactions'))) as tx
    FROM
    	jsonTemp jt
    LIMIT 5
    )
    LEFT ARRAY JOIN `tx.4`;
    

    查询结果如下:

    我使用以下代码创建了表:

    CREATE TABLE logsTemp
    (
    	txHash String,
    	txblockNumber String,
    	value String,
    	txlogs Tuple
    	(
    		address String,
    		txlogsData String,
    		topics Array(String)
    	)
    )
    ENGINE = MergeTree
    ORDER BY txblockNumber
    

    使用以下代码执行插入操作:

    INSERT INTO logsTemp 
    SELECT * 
    FROM 
    (
      SELECT *
      FROM
      (
        WITH JSONExtract(
          field, 
          'Tuple(transactions Nested(hash String, blockNumber String, value String, logs Nested(address String, data String, topics Array(String))))'
        ) AS parsed_json
        SELECT 
          untuple(arrayJoin(tupleElement(parsed_json, 'transactions'))) as tx
        FROM
          jsonTemp jt
      )
      LEFT ARRAY JOIN `tx.4`
    )
    

    结果发现插入后 txlogsData 缺失,如下:

    此处使用 Clickhouse 处于单机部署状态,版本为 22.13.1.1942

    wangshouh
        1
    wangshouh  
    OP
       2023-02-08 09:59:12 +08:00
    想办法自己解决了,怀疑是 `tuple` 的问题,所以在插入时进行了 `untuple` 操作,修正后的代码如下:

    ```sql
    INSERT
    INTO
    logsTemp
    SELECT
    `tx.1`,
    `tx.2`,
    `tx.3`,
    untuple(`tx.4`)
    FROM
    (
    SELECT
    *
    FROM
    (
    WITH JSONExtract(
    field,
    'Tuple(transactions Nested(hash String, blockNumber String, value String, logs Nested(address String, data String, topics Array(String))))'
    ) AS parsed_json
    SELECT
    untuple(arrayJoin(tupleElement(parsed_json,
    'transactions'))) as tx
    FROM
    jsonTemp jt
    )
    LEFT ARRAY
    JOIN `tx.4`
    )
    ```
    但仍不明白为什么 tuple 会导致数据列丢失

    ![]( )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:04 · PVG 03:04 · LAX 11:04 · JFK 14:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.