Проверьте подмножество, используя строку или массив в Impala - PullRequest
0 голосов
/ 23 мая 2018

У меня есть такая таблица

 col
-----
 A,B

col может быть строкой с запятой или массивом.У меня есть гибкость в хранении.

Как проверить col это подмножество другой строки или переменной массива?Например:

B,A -> TRUE (порядок не имеет значения)

A,D,B -> TRUE (другой промежуточный элемент)

A,D,C -> FALSE (отсутствует B)

У меня есть гибкость в отношении типа.Переменная - это то, что я не могу сохранить в таблице.

Пожалуйста, дайте мне знать, если у вас есть предложения только для Impala (без Hive).

Спасибо

1 Ответ

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

Не симпатичный метод, но, возможно, отправная точка ...

Предполагается, что таблица со столбцом уникального идентификатора id и столбцом array<string> col и строковой переменной с ',' в качестве разделителя (и ни одного случая сбежавшего '\,') ...

SELECT
  yourTable.id
FROM
  yourTable,
  yourTable.col
GROUP BY
  yourTable.id
HAVING
  COUNT(DISTINCT CASE WHEN find_in_set(col.item, ${VAR:yourString}) > 0 THEN col.item END)
  =
  LENGTH(regexp_replace(${VAR:yourString},'[^,]',''))+1

В основном ...

  • Разверните массивы в своемтаблица, до одной строки на элемент массива.
  • Проверьте, существует ли каждый элемент в вашей строке.
  • Объедините резервные копии, чтобы подсчитать, сколько элементов было найдено в строке.
  • Убедитесь, что количество найденных элементов совпадает с количеством элементов в строке

. COUNT(DISTINCT <CASE>) справляется с массивами типа {'a', 'a', 'b', 'b'}.

Без расширениястрока в массив или таблицу (что я не знаю, как это сделать) вы зависите от уникальности элементов в строке. (потому что я просто подсчитываю запятые в строке, чтобы узнать, сколько там элементов ...)

...