Как преобразовать строку в массив в ClickHouse / How to transform string to array in ClickHouse

Как преобразовать строку в массив в ClickHouse / How to transform string to array in ClickHouse
/assets/blog/authors/asanov_small.jpg
Ildar Asanov
#sql#clickhouse

Как преобразовать строку в массив в ClickHouse

Сегодня я столкнулся с проблемой, что в документации ClickHouse нет функции преобразования строки в массив. Поискав в StackOverflow, я тоже ничего внятно не нашел.

Перед прочтением рекомендую подписаться на мой телеграмм канал, где вы сможете найти актуальные новости, примеры и хаки в мире разработки: @asanov_tech

Попробую объяснить на примере:

У вас есть некая колонка data типа String, которая хранит JSON:

{"user_id":123456,"item_ids":[1203,1204,1205],"count":5}

Вы хотите преобразовать поле item_ids в массив, чтобы в дальнейшем с ним производить любые функции по работе с массивами (ссылка на документацию в конце поста).

Как преобразовать строку в массив из JSON

Строка может содержать не в отдельной колонке, а, например, в поле json. Пример ниже продемонстрирует как этого добиться:

  1. С помощью функции visitParamExtractRaw достать значение поля item_ids в сыром виде:
visitParamExtractRaw(data, 'item_ids')
  1. С помощью функции trim убрать лишние квадратные скобки по краям:
trim(BOTH '[]' FROM visitParamExtractRaw(data, 'reward_ids'))

p.s. Можно также убрать и фигурные скобки, просто замените [] на {}

  1. С помощью splitByChar разделить строку на массив, указав знак , в качестве разделителя:
splitByChar(',', trim(BOTH '[]' FROM visitParamExtractRaw(data, 'reward_ids')))

Итоговый SQL:

SELECT splitByChar(',', trim(BOTH '[]' FROM visitParamExtractRaw(data, 'reward_ids'))) FROM some_table;

Такие нехитрые действия нужны для того, чтобы вытянуть список. Дальше вы можете совершать любые манипуляции с данными.

А если вам нужно разложить массив на несколько строк, то читайте как это сделать в нашем блоге в статье "Как разложить массив на несколько строк в ClickHouse"

Ссылки:

Если было полезным, большая просьба подписаться на мой телеграмм канал и рассказать друзьям: @asanovpro

More Stories