如何在Clickhouse中获取LowCardinality类型底层值及索引映射关系
ClickHouse LowCardinality 底层值及映射关系查询方案
获取LowCardinality类型的底层索引值
直接使用内置函数lowCardinalityIndices()即可获取每一行数据对应的底层整数索引:
-- 示例:查询lc_col字段的逻辑值和对应的底层索引 SELECT lc_col AS logic_value, lowCardinalityIndices(lc_col) AS underlying_index FROM your_table
获取底层索引与逻辑值的映射关系
你之前遇到的多对多映射问题,是因为lowCardinalityKeys返回的是当前查询范围内的字典数组,没有和索引做绑定,直接和lowCardinalityIndices的结果按行对齐会出现错位。可以用以下两种方案获取正确的一对一映射:
方案1:全量映射查询(推荐,适配全表/跨分区场景)
直接对索引和逻辑值做去重,得到全局唯一的映射关系:
SELECT DISTINCT lowCardinalityIndices(lc_col) AS underlying_index, lc_col AS logic_value FROM your_table
方案2:基于字典数组的单分区/单数据片段映射查询
如果需要查询单个分区/单个数据片段内的字典映射,可以通过数组下标关联lowCardinalityKeys的返回结果:
SELECT -- ClickHouse数组下标从1开始,LowCardinality索引从0开始,需要减1对齐 idx - 1 AS underlying_index, logic_value FROM ( SELECT lowCardinalityKeys(lc_col) AS dict_arr, arrayJoin(arrayEnumerate(dict_arr)) AS idx, dict_arr[idx] AS logic_value FROM your_table -- 可指定单个分区/数据片段条件,避免重复查询 WHERE partition = 'your_partition_value' LIMIT 1 )
注:LowCardinality的底层索引默认是数据片段(Part)级别的,相同逻辑值在不同Part中可能对应不同的索引值,如果你需要全局统一的映射,优先使用方案1即可。
内容的提问来源于stack exchange,提问作者lights
相关产品推荐
相关产品推荐

