Создайте таблицу, используя данные pg_table_def в Redshift или DBT - PullRequest
0 голосов
/ 16 июня 2020

Чтобы создать таблицу из всех данных в pg_table_def, которые видны моему пользователю, я попробовал:

create table adhoc_schema.pg_table_dump as ( 
  select *
  from pg_table_def
);

Но это выдает ошибку:

Столбец "schemaname" имеет неподдерживаемый тип "name"

Любой способ создать таблицу из pg_table_def или information_schema.columns?

Ответы [ 2 ]

1 голос
/ 23 июня 2020

Обнаружил это в другом потоке, который, похоже, поможет.

Amazon считает внутренние функции, которые INFORMATION_SCHEMA.COLUMNS использует только функции Leader-Node. Вместо того, чтобы быть разумным и пересмотреть стандартизированные INFORMATION_SCHEMA.COLUMNS, Amazon стремилась определить свою собственную проприетарную версию. Для этого они сделали доступной другую функцию PG_TABLE_DEF, которая, кажется, удовлетворяет ту же потребность. Обратите внимание на примечание в центре о добавлении схемы в search_path.

Хранит информацию о столбцах таблицы.

PG_TABLE_DEF возвращает только информацию о таблицах, которые видны пользователю. Если PG_TABLE_DEF не возвращает ожидаемых результатов, убедитесь, что параметр search_path установлен правильно и включает соответствующие схемы.

Вы можете использовать SVV_TABLE_INFO для просмотра более полной информации о таблице, включая перекос распределения данных, перекос распределения ключей , размер таблицы и статистика.

Итак, используя ваш пример кода (переписанный для использования НЕ СУЩЕСТВУЕТ для ясности),

SET SEARCH_PATH to '$user', 'public', 'target_schema';

SELECT "column" 
FROM dev.fields f
WHERE NOT EXISTS (
  SELECT 1
  FROM PG_TABLE_DEF pgtd
  WHERE pgtd.column = f.field
  AND schemaname = 'target_schema'
);

См. также

Официальные документы по запросам Таблицы системы Redshift: https://docs.aws.amazon.com/redshift/latest/dg/t_querying_redshift_system_tables.html

0 голосов
/ 17 июня 2020

pg_table_def - это системная таблица ведущего узла с некоторыми дополнительными типами данных, не поддерживаемыми в пользовательских таблицах. Сначала вам нужно преобразовать в текст.

Однако это все равно не сработает, потому что pg_table_def является таблицей ведущего узла, а создаваемая вами таблица является пользовательской таблицей, хранящейся на вычислительных узлах. Вам нужно будет извлечь исходную информацию из таблиц, которые хранятся на вычислительных узлах. Поскольку я не знаю, какую информацию вы ищете в pg_table_def, я не могу точно сказать, какие из них вам нужны, но вы можете начать с stv_tbl_perm и присоединиться к pg_class и другим таблицам по мере необходимости.

...