sql—在clickhouse中使用数组(tuple(lowcardinality(string),int32))

bxgwgixi  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(647)

我有一张table

  1. CREATE TABLE table (
  2. id Int32,
  3. values Array(Tuple(LowCardinality(String), Int32)),
  4. date Date
  5. ) ENGINE MergeTree()
  6. PARTITION BY toYYYYMM(date)
  7. ORDER BY (id, date)

但在执行请求时

  1. SELECT count(*)
  2. FROM table
  3. WHERE (arrayExists(x -> ((x.1) = toLowCardinality('pattern')), values) = 1)

我出错了

  1. Code: 49. DB::Exception: Received from clickhouse:9000. DB::Exception: Cannot capture column 3 because it has incompatible type: got String, but LowCardinality(String) is expected..

如果替换“values”列的值数组(tuple(string,int32)),则执行请求时不会出错。
使用数组(tuple(lowcardinality(string),int32))时会出现什么问题?

zazmityj

zazmityj1#

在修复之前(请参见bug 7815),可以使用以下解决方法:

  1. SELECT uniqExact((id, date)) AS count
  2. FROM table
  3. ARRAY JOIN values
  4. WHERE values.1 = 'pattern'

对于有多个数组列的情况,可以这样使用:

  1. SELECT uniqExact((id, date)) AS count
  2. FROM
  3. (
  4. SELECT
  5. id,
  6. date,
  7. arrayJoin(values) AS v,
  8. arrayJoin(values2) AS v2
  9. FROM table
  10. WHERE v.1 = 'pattern' AND v2.1 = 'pattern2'
  11. )
展开查看全部
rsaldnfx

rsaldnfx2#

值数组(元组(低基数(字符串),int32)),
不要使用 Tuple . 它只带来缺点。磁盘上还有2个文件。如果只提取一个元组元素
https://gist.github.com/den-crane/f20a2dce94a2926a1e7cfec7cdd12f6d

  1. valuesS Array(LowCardinality(String)),
  2. valuesI Array(Int32)

相关问题