Стратегия фильтрации и группировки столбца String в базе данных AWS Redshift - PullRequest
0 голосов
/ 16 мая 2018

Как разработать стратегию для фильтрации и группировки столбцов String в базе данных AWS Redshift?

Table_Id | Categories          | Value
<ID>     | AAA1; AAA1-1; AAA2  | 10
<ID>     | AAA1; AAA1-2; AAA2  | 15
<ID>     | AAA2                | 5
.....

Теперь я хочу отфильтровать записи по отдельным категориям, таким как «AAA1» или «AAA1 и AAA2». Ожидаетсявывод из запроса будет выглядеть так:

Table_Id | Categories         | Value
<ID>     | AAA1               | 25
<ID>     | AAA1-1             | 10
<ID>     | AAA1-2             | 15
<ID>     | AAA2               | 30
.....

Поэтому необходимо сгруппировать результаты по отдельным категориям.Обратите внимание, что этот вопрос не удовлетворяет моему варианту использования, поскольку нет возможности запустить регулярное выражение или split_part для огромного количества записей.Выполнение этого решения приводит к получению данных в течение 4+ часов.

Другие альтернативные способы, которые мы пробовали:

  1. Создание значения хеш-функции для каждой возможной комбинации, а затем поиск с использованием этого хэша,Однако это приводит к чрезвычайно большому количеству хеш-значений.
  2. Назначьте отдельное простое число каждой категории, а затем сохраните произведение простых чисел на значение.Однако это приводит к очень большому количеству, которое не может быть сохранено в базе данных.

Есть ли какая-либо другая математическая или другая стратегия, которая может быть применена для решения этой проблемы?

1 Ответ

0 голосов
/ 16 мая 2018

Вам нужны данные в лучшем формате для запросов. Есть два возможных дизайна:

Одна таблица со столбцом для каждого атрибута

Table_Id | Categories          | Value | CAT-AAA1 | CAT-AAA1-1 | CAT-AAA2
<ID>     | AAA1; AAA1-1; AAA2  | 10    | TRUE     | TRUE       | TRUE
<ID>     | AAA1; AAA1-2; AAA2  | 15    | TRUE     | FALSE      | TRUE
<ID>     | AAA2                | 5     | FALSE    | FALSE      | TRUE
.....

Это будет включать добавление столбца для каждого атрибута, а затем запуск некоторых команд UPDATE для заполнения столбцов, таких как:

UPDATE <table> SET CAT-AAA1 = TRUE WHERE Categories CONTAINS '%AAA1;%'

Тогда было бы легко запросить таблицу:

SELECT SUM(Value) FROM <table> WHERE CAT-AAA1 AND CAT-AAA1-2;

Redshift может обрабатывать до 1600 столбцов на таблицу. Вполне нормально иметь широкие таблицы в хранилище данных.

Таблица один-ко-многим

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

Table_Id | Category
1     | AAA1
1     | AAA1-1
1     | AAA1-2
2     | AAA1

Затем можно выполнить запрос, присоединившись к этой таблице поиска, чтобы найти правильные строки, например:

SELECT SUM(Value)
FROM <table>
JOIN <lookup-table> USING Table_Id
WHERE Category = 'AAA1';
...