Как мне обработать эту строку? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть некоторые результаты в одной из моих таблиц, и результаты разные, каждая; представляет несколько записей в одном столбце, который мне нужно выделить.

Вот мой SQL и результаты:

    select REGEXP_COUNT(value,';') as cnt,
    description
    from mytable;
1   {Managed By|xBoss}{xBoss xBoss Number|X0910505569}{Time 
Requested|2009-04-15 20:47:11.0}{Time Arrived|2009-04-15 21:46:11.0};   
1   {Managed By|Modern Management}{xBoss Number|}{Time Requested|2009-04- 
16 14:01:29.0}{Time Arrived|2009-04-16 14:44:11.0}; 
2   {Managed By|xBoss}{xBoss Number|X091480092}{Time Requested|2009-05-28 
08:58:41.0}{Time Arrived|};{Managed By|Jims Allocation}{xBoss xBoss 
Number|}{Time Requested|}{Time Arrived|};   

Желаемый вывод:

R1:
Managed By: xBoss
Time Requested:2009-10-19 07:53:45.0
Time Arrived: 2009-10-19 07:54:46.0

R2:
Managed By:Own Arrangements
Number: x5876523
Time Requested: 2009-10-19 07:57:46.0
Time Arrived:

R3:
Managed By: xBoss
Time Requested:2009-10-19 08:07:27.0
    select   
    SPLIT_PART(description, '}', 1), 
    SPLIT_PART(description, '}', 2), 
    SPLIT_PART(description, '}', 3), 
    SPLIT_PART(description, '}', 4), 
    SPLIT_PART(description, '}', 5) 
    as description_with_tag from mytable;

Это нормально, когда счетчик 1, но когда в описании несколько ;, это не дает мне результатов.

Можно ли поместить это в массив на основе количества?

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Во-первых, стоит отметить, что данные в таком формате не могут использовать все преимущества Redshift.Amazon Redshift - это столбчатая база данных, которая может обеспечить удивительную производительность, когда данные хранятся в соответствующих столбцах.Тем не менее, выбор конкретного текста из текстового поля всегда будет работать плохо.

Поэтому мой главный совет - предварительно обработать данные в обычные строки и столбцы , чтобы Redshift мог предоставить вамлучшие возможности.

Однако, чтобы ответить на ваш вопрос, я бы порекомендовал сделать Скалярную пользовательскую функцию :

CREATE FUNCTION f_extract_curly (s TEXT, key TEXT)
  RETURNS TEXT
STABLE
AS $$
  # List of items in {brackets}
  items = s[1:-1].split('}{')

  # Dictionary of Key|Value from items
  entries = {i.split('|')[0]: i.split('|')[1] for i in items}

  # Return desired value
  return entries.get(key, None)

$$ LANGUAGE plpythonu;

Я загрузил данные примера:

CREATE TABLE foo (
    description TEXT
);

INSERT INTO foo values('{Managed By|xBoss}{xBoss xBoss Number|X0910505569}{Time Requested|2009-04-15 20:47:11.0}{Time Arrived|2009-04-15 21:46:11.0};');
INSERT INTO foo values('{Managed By|Modern Management}{xBoss Number|}{Time Requested|2009-04-16 14:01:29.0}{Time Arrived|2009-04-16 14:44:11.0};');
INSERT INTO foo values('{Managed By|xBoss}{xBoss Number|X091480092}{Time Requested|2009-05-28 08:58:41.0}{Time Arrived|};{Managed By|Jims Allocation}{xBoss xBoss Number|}{Time Requested|}{Time Arrived|};');

Затем я проверил это с помощью:

SELECT
  f_extract_curly(description, 'Managed By'),
  f_extract_curly(description, 'Time Requested')
FROM foo

и получил результат:

xBoss               2009-04-15 20:47:11.0
Modern Management   2009-04-16 14:01:29.0
xBoss   

Он не знает, как обрабатывать строки с одинаковымиполе указывается дважды (с точкой с запятой).Вы не предоставили мне достаточно примеров строк ввода и вывода, чтобы я мог понять, что вам нужно в таких ситуациях, но вы можете настроить код под свои требования.

0 голосов
/ 04 мая 2019

В Redshift нет типа данных массива. Есть 2 варианта:

1) Сначала split_part по ';', затем объединение результатов отдельно для каждого индекса первого split_part результата, затем split_part результатов по '}' и, наконец, то, что вам нужно.

2) Создайте пользовательский интерфейс Python и обработайте эти строки с помощью Python. Я думаю, это лучшее решение для вашего случая использования.

3) Преобразуйте свои данные вне Redshift. Судя по вашей структуре данных, гораздо лучше обработать ее перед копированием в Redshift, распаковывая массивы в строки и извлекая ключи из ваших объектов в столбцы.

...