Амазонка Redshift — это полностью управляемый сервис для озер данных, аналитики данных и хранилищ данных для стартапов, средних и крупных предприятий. Amazon Redshift используется десятками тысяч компаний по всему миру для модернизации своей платформы анализа данных.
Зеленая слива — это массивно-параллельная база данных с открытым исходным кодом, используемая для аналитики, в основном для локальной инфраструктуры. Greenplum основан на PostgreSQL движок базы данных.
Многие клиенты считают миграцию на Amazon Redshift из Greenplum привлекательным вариантом вместо управления локальной Greenplum по следующим причинам:
Хотя и Greenplum, и Amazon Redshift используют движок базы данных PostgreSQL с открытым исходным кодом, миграция по-прежнему требует тщательного планирования и ручного вмешательства. В этом посте рассматриваются ключевые функции и рекомендации по преобразованию кода из Greenplum в Amazon Redshift. Он ориентирован на миграцию процедур, функций и представлений.
Обзор решения
Сервис миграции баз данных AWS (AWS DMS) и Инструмент преобразования схемы AWS (AWS SCT) может перенести большинство объектов при миграции гетерогенной базы данных из Greenplum в Amazon Redshift. Но бывают ситуации, когда группы по преобразованию кода сталкиваются с ошибками и предупреждениями для представлений, процедур и функций при их создании в Amazon Redshift. Для решения подобных ситуаций требуется ручное преобразование кода.
В сообщениях основное внимание уделяется тому, как справиться со следующими проблемами при переходе с Greenplum на Amazon Redshift:
- Массивы
- Даты и временные метки
- Регулярные выражения (regex)
Обратите внимание, что для этого поста мы используем Greenplum 4.3 и Amazon Redshift PostgreSQL 8.2.
Работа с функциями массива
AWS SCT не преобразует функции массива при переходе с Greenplum или PostgreSQL на Amazon Redshift. Разработчикам необходимо активно конвертировать эти функции вручную. В этом посте описаны наиболее распространенные функции массива:
- МАССИВ_UPPER
- JSON_EXTACT_ARRAY_ELEMENT_TEXT и JSON_ARRAY_LENGTH
- НЕСТ ()
- STRING_AGG ()
- ЛЮБОЙ МАССИВ()
МАССИВ_ВЕРХНИЙ()
Эта функция возвращает верхнюю границу массива. Его можно использовать для извлечения nth элемент из массива в PostgreSQL или Greenplum.
Код Greenplum выглядит следующим образом:
В Amazon Redshift нет функции извлечения элемента из массива; однако для этой цели можно использовать две функции JSON:
- JSON_EXTRACT_ARRAY_ELEMENT_TEXT() – Возвращает элемент массива JSON в самом внешнем массиве строки JSON.
- JSON_ARRAY_LENGTH() – Возвращает количество элементов во внешнем массиве строки JSON.
Смотрите следующий код:
РАЗНЕСТ()
UNNEST() — это системная функция PostgreSQL для частично структурированных данных, расширения массива или комбинации массивов в набор строк. Он введен для повышения производительности базы данных тысяч или записей для вставок, обновлений и удалений.
Вы можете использовать UNNEST() для базовый массив, несколько массивови несколько массивов разной длины.
Некоторые функции Amazon Redshift, используемые для исключения вложенности массивов: split_part
, json_extract_path_text
, json_array_length
и json_extract_array_element_text
.
В Greenplum функция UNNEST используется для расширения массива до набора строк:
Результат
1
2
Amazon Redshift не поддерживает функцию UNNEST; вы можете использовать следующий обходной путь:
STRING_AGG ()
Функция STRING_AGG() является агрегатная функция который объединяет список строк и помещает разделитель между ними. Функция не добавляет разделитель в конец строки. См. следующий код:
Код Greenplum выглядит следующим образом:
Эквивалентом функции STRING_AGG() в Amazon Redshift является LISTAGG(). Эта агрегатная функция упорядочивает строки для этой группы в соответствии с выражением ORDER BY, а затем объединяет значения в одну строку:
Смотрите следующий код:
ЛЮБОЙ МАССИВ()
Функция PostgreSQL ANY ARRAY() оценивает и сравнивает левое выражение с каждым элементом массива:
В Amazon Redshift оценку можно выполнить с помощью оператора IN:
Работа с функциями даты
В этом разделе мы обсудим вычисление разницы между date_part
для Greenplum и datediff для Amazon Redshift.
Когда приложению необходимо вычислить разницу между подполями дат для Greenplum, оно использует функцию дата_часть, который позволяет извлекать подполя, такие как год, месяц, неделя и день. В следующих примерах запросов мы вычисляем количество completion_days
путем вычисления разницы между originated_date
и eco_date
.
Для вычисления разницы между подполями даты в Amazon Redshift есть функция datediff. Следующие запросы показывают пример того, как вычислить completion_days
как разница между eco_date
и orginated_date
. DATEDIFF определяет количество границ частей даты, которые пересекаются между двумя выражениями.
Мы сравниваем запросы Greenplum и Amazon Redshift следующим образом:
- Разница по годам
Следующий запрос Greenplum возвращает 1 год между 2009 и 01:
Следующий запрос Amazon Redshift возвращает 1 год между 2009 и 01:
- Разница по месяцам
Следующий запрос Greenplum возвращает 1 месяц между 2009 и 01:
Следующий запрос Amazon Redshift возвращает 1 месяц между 2009 и 01:
- Разница по неделям
Следующий запрос Greenplum возвращает 0 недель между 2009-01-01 и 2009-12-31:
Следующий запрос Amazon Redshift возвращает 0 недель между 2009 января 01 г. и 01 декабря 2009 г.:
- Разница по дням
Следующий запрос Greenplum возвращает 1 день:
Следующий запрос Amazon Redshift возвращает 1 день:
- Разница по часам
Следующий запрос Greenplum возвращает 1 час:
Следующий запрос Amazon Redshift возвращает 1 час:
- Разница по минутам
Следующий запрос Greenplum возвращает 3 минуты:
Следующий запрос Amazon Redshift возвращает 1 минуту:
- Разница в секунду
Следующий запрос Greenplum возвращает 40 секунд:
Следующий запрос Amazon Redshift возвращает 45 секунд:
Теперь давайте посмотрим, как мы используем Amazon Redshift для расчета дней и недель в секундах.
Следующий запрос Amazon Redshift отображает 2 дня:
Следующий запрос Amazon Redshift отображает 9 недель:
Для Greenplum подполя даты должны быть заключены в одинарные кавычки, тогда как для Amazon Redshift мы можем использовать подполя даты, такие как год, месяц, неделя, день, минута, секунда, без кавычек. Для Greenplum мы должны вычесть подполе из одной части в другую, тогда как для Amazon Redshift мы можем использовать запятые для разделения двух дат.
Извлечь ISOYEAR из даты
ISOYEAR 8601 — это год с нумерацией недель. Он начинается с понедельника недели, содержащей 4 января. Таким образом, для даты начала января или конца декабря год по ISO может отличаться от года по григорианскому календарю. Год ISO состоит из 52 или 53 полных недель (364 или 371 день). Дополнительная неделя называется високосной; год с такой неделей называется високосным.
Следующий запрос Greenplum отображает ISOYEAR 2020:
Следующий запрос Amazon Redshift отображает ISOYEAR 2020:
Функция для generate_series()
Greenplum принял функцию PostgreSQL generate_series()
. Но generate_series
Функция работает по-другому с Amazon Redshift при извлечении записей из таблицы, потому что это только ведущий узел функции.
Чтобы отобразить серию чисел в Amazon Redshift, выполните следующий запрос на ведущем узле. В этом примере он отображает 10 строк, пронумерованных от 1 до 10:
Чтобы отобразить ряд дней для заданной даты, используйте следующий запрос. Он извлекает день из заданной даты и вычитает 1, чтобы отобразить ряд чисел от 0 до 6:
Но для запросов, извлекающих запись из таблицы, соединяющихся со строкой другой таблицы и обрабатывающих данные на вычислительном узле, это не работает и генерирует сообщение об ошибке с недопустимой операцией. Следующий код является примером оператора SQL, который работает для Greenplum, но не работает для Amazon Redshift:
Для Amazon Redshift решение состоит в том, чтобы создать таблицу для хранения данных ряда и переписать код следующим образом:
Работа с регулярными выражениями (функции регулярных выражений)
Amazon Redshift и Greenplum поддерживают три условия для сопоставление с образцом:
- LIKE
- ПОХОЖИЙ НА
- POSIX-операторы
В этом посте мы не будем подробно обсуждать все эти сопоставления с образцом. Вместо этого мы обсудим несколько функций регулярных выражений и escape-символов регулярных выражений, которые не поддерживаются Amazon Redshift.
Функция Regexp_split_to_table
Ассоциация Regex_split_to_table Функция разбивает строку, используя шаблон регулярного выражения POSIX в качестве разделителя.
Эта функция имеет следующий синтаксис:
Для Greenplum мы используем следующий запрос:
Для Amazon Redshift regexp_split_to_table
функция должна быть преобразована с помощью Amazon Redshift split_part
функция:
Другой способ конвертировать regexp_split_to_table
заключается в следующем:
Подстрока из регулярных выражений
Подстрока (строка из шаблона регулярного выражения) извлекает подстроку или значение, соответствующее переданному шаблону. Если совпадений нет, возвращается ноль. Для получения дополнительной информации см. Соответствие шаблону.
Мы используем следующий код в Greenplum:
Мы можем использовать regexp_substr для преобразования этого кода в Amazon Redshift. Он возвращает символы, извлеченные из строки путем поиска шаблона регулярного выражения. Синтаксис следующий:
Ключевые моменты при преобразовании экранов регулярных выражений
Экранирующий символ E в Postgres не работает в Amazon Redshift. Кроме того, в Amazon Redshift не поддерживаются следующие ограничения регулярных выражений Greenplum:
- m - Соответствует только началу слова
- y – Соответствует только началу или концу слова
Для Amazon Redshift вместо этого используйте \< и \> или [[:<:]] и [[:>:]].
Используйте следующий код для Greenplum:
Используйте следующий код для Amazon Redshift:
OR
Заключение
Для переноса гетерогенной базы данных из Greenplum в Amazon Redshift можно использовать AWS DMS и AWS SCT для переноса большинства объектов базы данных, таких как таблицы, представления, хранимые процедуры и функции.
В некоторых ситуациях для исходной среды используется одна функция, а целевая среда не поддерживает ту же функцию. В этом случае требуется ручное преобразование для получения того же набора результатов и завершения миграции базы данных.
В некоторых случаях использование новой оконной функции, поддерживаемой целевой средой, оказывается более эффективным для аналитических запросов, обрабатывающих петабайты данных.
В этом посте описано несколько ситуаций, когда требуется ручное преобразование кода, что также повышает эффективность кода и делает запросы более эффективными.
Если у вас есть какие-либо вопросы или предложения, пожалуйста, поделитесь своим мнением.
Об авторах
Джагрит Шреста является консультантом по базам данных в Amazon Web Services (AWS). Он работает специалистом по базам данных, помогая клиентам переносить рабочие нагрузки локальных баз данных на AWS и предоставляя технические рекомендации.
Ишвар Адхикари является консультантом по базам данных в Amazon Web Services (AWS). Он тесно сотрудничает с клиентами, чтобы модернизировать их базы данных и инфраструктуры приложений. Его областью деятельности является миграция реляционных баз данных из локального центра обработки данных в облако AWS.
Шреник Парех работает консультантом по базам данных в Amazon Web Services (AWS). Он специализируется на оценке миграции баз данных, миграции баз данных, модернизации среды баз данных с помощью специально созданной базы данных с использованием сервисов облачных баз данных AWS. Он также занимается веб-сервисами AWS для анализа данных. В свободное время любит пешие прогулки, йогу и другие виды активного отдыха.
Сантош Минхалимат является архитектором данных в AWS. Он работает над созданием аналитических решений, созданием озер данных и переносом базы данных в AWS.
- SEO-контент и PR-распределение. Получите усиление сегодня.
- Платоблокчейн. Интеллект метавселенной Web3. Расширение знаний. Доступ здесь.
- Источник: https://aws.amazon.com/blogs/big-data/code-conversion-from-greenplum-to-amazon-redshift-handling-arrays-dates-and-regular-expressions/
- 1
- 10
- 100
- 11
- 2020
- 39
- 7
- 9
- a
- По
- Учетная запись
- достигнутый
- активно
- Дополнительно
- адрес
- принял
- Все
- позволяет
- Amazon
- Amazon Web Services
- Веб-службы Amazon (AWS)
- Аналитические фармацевтические услуги
- аналитика
- и
- Другой
- Применение
- ПЛОЩАДЬ
- около
- массив
- оценки;
- привлекательный
- AWS
- основанный
- НИМ
- , так как:
- начало
- между
- связанный
- Границы
- Строительство
- бизнес
- расчет
- под названием
- случаев
- случаев
- КПП
- Центр
- персонаж
- символы
- тесно
- облако
- код
- сочетание
- Общий
- сравнить
- полный
- Вычисление
- Условия
- соображения
- ограничения
- консультант
- Консультанты
- Конверсия
- конвертировать
- переделанный
- чехлы
- Создайте
- Создающий
- Пересекать
- Скрещенный
- Клиенты
- данным
- Анализ данных
- Центр обработки данных
- хранилища данных
- База данных
- базы данных
- Время
- Финики
- день
- Дней
- Декабрь
- подробность
- определяет
- застройщиков
- разница
- различный
- обсуждать
- Дисплей
- дисплеев
- DOE
- не
- Dont
- каждый
- Рано
- затрат
- эффективный
- элементы
- сотрудников
- столкновение
- Двигатель
- предприятий
- Окружающая среда
- Эквивалент
- ошибка
- ошибки
- Эфир (ETH)
- оценка
- пример
- Расширьте
- расширяющийся
- опыта
- выражения
- дополнительно
- извлечение
- Экстракты
- не удается
- Обратная связь
- несколько
- финансы
- Флаги
- Фокус
- внимание
- фокусируется
- после
- следующим образом
- Для стартапов
- форма
- найденный
- от
- полный
- полностью
- функция
- Функции
- Gen
- генерирует
- данный
- земной шар
- группы
- обрабатывать
- Управляемость
- имеет
- помощь
- пеший туризм
- Главная
- Как
- How To
- Однако
- HTML
- HTTPS
- улучшать
- улучшается
- in
- включены
- информация
- Инфраструктура
- инфраструктура
- Вставки
- вместо
- вмешательство
- выпустили
- ISO
- IT
- саму трезвость
- январь
- Джим
- John
- присоединиться
- присоединение
- JSON
- Основные
- большой
- Поздно
- лидер
- Список
- посмотреть
- серия
- сделать
- управляемого
- управления
- руководство
- вручную
- Маркетинг
- массивно
- Совпадение
- согласование
- средний
- сообщение
- мигрировать
- миграция
- минут
- Мобильный телефон
- модернизировать
- понедельник
- Месяц
- БОЛЕЕ
- более эффективным
- самых
- Необходимость
- потребности
- Новые
- узел
- номер
- нумерованный
- номера
- объекты
- ONE
- с открытым исходным кодом
- операция
- оператор
- Опция
- заказ
- заказы
- Другое
- На открытом воздухе
- контуры
- Параллельные
- параметры
- часть
- Прошло
- шаблон
- производительность
- выполнения
- ФИЛ
- Мест
- планирование
- Платформа
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- пожалуйста
- пунктов
- должность
- После
- Postgresql
- Блог
- Процедуры
- процесс
- обработка
- производит
- доказывает
- обеспечивать
- цель
- Вопросы
- причины
- запись
- учет
- регулярный
- обязательный
- требуется
- Итоги
- Возвращает
- РЯД
- Run
- то же
- поиск
- Во-вторых
- секунды
- Раздел
- Серии
- обслуживание
- Услуги
- набор
- несколько
- Поделиться
- показывать
- одинарной
- ситуация
- обстоятельства
- So
- Решение
- Решения
- некоторые
- Источник
- специалист
- расколы
- SQL
- Стартапы
- заявление
- Стив
- По-прежнему
- магазин
- хранить
- такие
- поддержка
- Поддержанный
- синтаксис
- система
- T1
- ТАБЛИЦЫ
- цель
- команды
- Технический
- временный
- Ассоциация
- Источник
- их
- тысячи
- три
- время
- отметка времени
- в
- союз
- Updates
- использование
- ценностное
- Наши ценности
- Просмотры
- Web
- веб-сервисы
- неделя
- Недели
- который
- в то время как
- без
- Работа
- работает
- год
- Йога
- ВАШЕ
- зефирнет