Вопрос или проблема
У меня есть хранилище данных в s3 с бронзовым, серебряным и золотым уровнями, где данные хранятся в формате delta. Мне нужно создать золотую таблицу из серебряной таблицы, и я решил, что лучший способ сделать это – создать представление в Athena. Это представление должно включать несколько преобразований, где значения в одном столбце изменяются на основе значений в другом столбце, а также одно преобразование, где создается новый столбец и заполняется на основе соответствия regex другого столбца.
Мне удалось сделать это в pyspark, но я не могу перенести это в sql-запросы в Athena. Для первого преобразования я попробовал следующее:
CREATE OR REPLACE VIEW "test_view" AS
SELECT a.*
set property_name = (CASE
WHEN domain = 'Some.com'
THEN 'properties/4'
END);
FROM "silver_d"."silver_table" a
Но я получил следующую ошибку: Допускается только один sql-запрос.
Кто-нибудь знает, как я могу создать представление на основе таблицы и применить эти преобразования?
Буду очень благодарен за любую помощь.
Ответ или решение
Для создания представления в Amazon Athena, которое включает в себя изменения значений столбцов на основе условий и добавление нового столбца с использованием регулярного выражения, необходимо правильно использовать синтаксис SQL. Athena основан на стандартном SQL, и ваш код должен следовать правильным конструкциям, чтобы избежать ошибок.
Вот как можно справиться с вашими требованиями:
Шаги для создания представления
-
Изменение значений существующего столбца с использованием SQL:
Для изменения значений в столбце на основе условия, используйте конструкциюCASE
в блокеSELECT
. В вашем случае, вы можете сделать это следующим образом: -
Создание нового столбца на основе регулярного выражения:
Для того чтобы создать новый столбец, исходя из регулярного выражения, вы можете воспользоваться функциейREGEXP_EXTRACT
.
Пример SQL-запроса
Вот пример того, как можно создать представление с учетом всех условий:
CREATE OR REPLACE VIEW "test_view" AS
SELECT
a.*,
CASE
WHEN a.domain = 'Some.com' THEN 'properties/4'
ELSE a.property_name
END AS property_name_modified,
REGEXP_EXTRACT(a.some_column, 'ваше_регулярное_выражение') AS new_column
FROM
"silver_d"."silver_table" a;
Объяснение кода
-
CASE WHEN: Этот блок позволяет изменять значения в зависимости от условия. В данном случае, если значение в столбце
domain
равно'Some.com'
, то новый столбецproperty_name_modified
будет принимать значение'properties/4'
. В противном случае он будет оставаться равным значению существующего столбцаproperty_name
. -
REGEXP_EXTRACT: Эта функция извлекает часть строки, соответствующую заданному регулярному выражению. Вы должны заменить
'ваше_регулярное_выражение'
вашим конкретным регулярным выражением, исходя из ваших требований.
Примечания
- Убедитесь, что все имена столбцов актуальны и совпадают с теми, что имеются в исходной таблице.
- Если у вас несколько условий для изменения значений, вы можете добавить дополнительные
WHEN ... THEN
в блокCASE
. - Регулярные выражения могут быть сложными; проведите тесты отдельно, чтобы найти правильные выражения для ваших данных.
Заключение
Теперь вы можете создать представление в Athena с необходимыми условиями и преобразованиями. Убедитесь, что вы тестируете SQL-запросы на небольших объемах данных, прежде чем применять их к более крупным наборам данных, чтобы гарантировать, что все работает как задумано. Если у вас есть дополнительные сложности, не стесняйтесь спрашивать о конкретных моментах.