Создание представлений программно в Афине не задокументировано и не поддерживается, но возможно.Что происходит за кулисами, когда вы создаете представление с использованием StartQueryExecution
, так это то, что Athena позволяет Presto создавать представление, а затем извлекает внутреннее представление Presto и помещает его в каталог Glue.
Проблема устаревания обычно возникает из столбцов.в метаданных Presto и в метаданных Glue, которые не синхронизированы.Представление Athena действительно содержит три описания представления: представление SQL, столбцы и их типы в формате Glue, а также столбцы и типы в формате Presto.Если какой-либо из них выйдет из синхронизации, вы получите «… устарело; оно должно быть воссоздано».ошибка.
Это требования к таблице Glue для работы в качестве представления Athena:
TableType
должно быть VIRTUAL_VIEW
Parameters
mustсодержать presto_view: true
TableInput.ViewOriginalText
должно содержать закодированное представление Presto (см. ниже) StorageDescriptor.SerdeInfo
должно быть пустой картой StorageDescriptor.Columns
должно содержать всестолбцы, определяемые представлением, с их типами
Сложной частью является закодированное представление Presto.Эта структура создается с помощью этого кода: https://github.com/prestosql/presto/blob/27a1b0e304be841055b461e2c00490dae4e30a4e/presto-hive/src/main/java/io/prestosql/plugin/hive/HiveUtil.java#L597-L600,, и это более или менее то, что он делает:
- Добавляет префикс
/* Presto View:
(обратите внимание на конечный пробел) - Добавляет строку JSON в кодировке 64, которая содержит представление SQL, столбцы и их типы, а также некоторые метаданные каталога (см. Ниже)
- Добавляет суффикс
*/
(обратите внимание на начальный пробел)
JSON, который описывает представление, выглядит следующим образом:
- A
catalog
свойство, которое должно иметь значение awsdatacatalog
. - A
schema
свойство, котороедолжно быть именем базы данных, в которой создается представление (т. е. оно должно соответствовать свойству DatabaseName
окружающей структуры Glue. - Список столбцов, каждый из которых содержит
name
и type
- Свойство
originalSql
с фактическим SQL представления (не включая CREATE VIEW …
, оно должно начинаться с SELECT …
или WITH …
)
Вот пример:
{
"catalog": "awsdatacatalog",
"schema": "some_database",
"columns": [
{"name": "col1", "type": "varchar"},
{"name": "col2", "type": "bigint"}
],
"originalSql": "SELECT col1, col2 FROM some_other_table"
}
Одно предостережение: типы столбцов почти, но не совсем совпадают с именами.в клее.Если Athena / Glue будет иметь string
, значение в этом JSON должно быть varchar
.Если Athena / Glue использует array<string>
, значение в этом JSON должно быть array(string)
, а struct<foo:int>
становится struct(foo int)
.
Это довольно грязно, и для того, чтобы собрать все вместе, нужно немного потрудиться и протестировать,Самый простой способ заставить его работать - это создать несколько представлений и расшифровать, выполнив инструкции, приведенные выше, чтобы посмотреть, как они выглядят, а затем попробовать сделать это самостоятельно.