2014-11-03 3 views
0

В Amazon Redshift generate_series(), похоже, поддерживается на узле лидера, но не на вычислительных узлах. Есть ли способ использовать generate_series для создания таблицы на узле лидера, а затем нажать ее на вычислительные узлы?Использование create_series для создания таблицы

Этот запрос работает отлично, работает на узле лидера:

with 
    date_table as (select now()::date - generate_series(0, 7 * 10) as date), 
    hour_table as (select generate_series(0, 24) as hour), 
    time_table as (
     select 
     date_table.date::date as date, 
     extract(year from date_table.date) as year, 
     extract(month from date_table.date) as month, 
     extract(day from date_table.date) as day, 
     hour_table.hour 
    from date_table CROSS JOIN hour_table 
) 
SELECT * 
from time_table 

Однако этот запрос не удается:

create table test 
diststyle all 
as (
    with 
     date_table as (select now()::date - generate_series(0, 7 * 10) as date), 
     hour_table as (select generate_series(0, 24) as hour), 
     time_table as (
     select 
      date_table.date::date as date, 
      extract(year from date_table.date) as year, 
      extract(month from date_table.date) as month, 
      extract(day from date_table.date) as day, 
      hour_table.hour 
    from date_table CROSS JOIN hour_table 
) 
    SELECT * 
    from time_table 
); 

Единственное решение, которое я могу думать прямо сейчас, чтобы вытащить результаты запроса в другую программу (например, python), а затем вставить результат в базу данных, но это кажется хакерским.

Для тех из вас, кто никогда не использовал redshift, это сильно измененный вариант postgresql и имеет множество собственных особенностей. Ниже запрос полностью действует работает нормально:

create table test diststyle all as (select 1 as a, 2 as b); 
select * from test 

выходов:

a b 
1 2 

проблема проистекает из разницы между leadernode только функциональной и вычислительными узлами функциями на красном смещении. Я уверен, что это не из-за ошибки в моем запросе.

+0

'test diststyle all' является недопустимым именем таблицы. Используйте 'create table test as ...' или 'create table test_diststyle_all as ...' И не '(' после 'as' в' create table .. as' –

+0

@a_horse_with_no_name Redshift - сильно измененный вариант postgres. Когда вы создаете таблицу в redshfit, вы можете указать стиль распространения (distkey, diststyle even или distyle all), который управляет распределением таблицы по кластеру. Вышеупомянутый SQL полностью действителен и если я заменю as (...) с чем-то другим (например, 'select * from users limit 1'), запрос выполняется нормально. – Zach

ответ

1

Я не нашел способ использовать функции только для ведущего узла для создания таблиц. Нет (AFAICT) любого волшебного синтаксиса, который вы можете использовать, чтобы заставить их загружать свой вывод обратно в таблицу.

В итоге я использовал таблицы чисел для достижения аналогичного результата. Даже огромная таблица чисел займет очень мало места в вашем кластере Redshift с сжатием runlength.

+0

Я думаю, что это то, что я тоже сделаю. Насколько велика была таблица чисел, и вы распространяли ее с помощью diststyle даже? – Zach

+0

У меня есть несколько таблиц чисел в возрастающих порядках (10/100/1000/10000/100 000/1 000 000). Все они настроены на 'DISTSTYLE ALL'. –

Смежные вопросы