Передача параметров функции разгрузки Redshift (активность sql) по конвейеру данных AWS [дубликат]

Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .

Если базовая функция многозначна

nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data:

function synchronousCode() {

    var getURL = function(url) {
        return window.fetch(url).data.text().data;
    };
    
    var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
    console.log('received bytes:',getURL(url).length);
    
};

nsynjs.run(synchronousCode,{},function(){
    console.log('synchronousCode done');
});

Если базовая функция не обещает

Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):

var ajaxGet = function (ctx,url) {
    var res = {};
    var ex;
    $.ajax(url)
    .done(function (data) {
        res.data = data;
    })
    .fail(function(e) {
        ex = e;
    })
    .always(function() {
        ctx.resume(ex);
    });
    return res;
};
ajaxGet.nsynjsHasCallback = true;

Шаг 2. Вставить синхронную логику в функцию:

function process() {
    console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}

Шаг 3. Выполнить функцию синхронно через nnsynjs:

nsynjs.run(process,this,function () {
    console.log("synchronous function finished");
});

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

Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples

7
задан urig 15 December 2014 в 11:00
поделиться

3 ответа

Я считаю, что вы используете эту операцию sql для Redshift. Можете ли вы изменить свой sql-скрипт, чтобы ссылаться на параметры, используя их позиционную нотацию. Чтобы ссылаться на параметры самого оператора sql, используйте $ 1, $ 2 и т. Д.

См. http://www.postgresql.org/docs/9.1/static/sql-prepare.html

0
ответ дан AravindR 27 August 2018 в 08:39
поделиться

Это скрипт, который отлично работает с psql shell:

insert into tempsdf select * from source where source.id = '123';

Вот некоторые из моих тестов в SqlActivity с использованием Data-Pipelines:


Тест 1 : Использование? '

insert into mytable select * from source where source.id = ?; - отлично работает, если используется через параметр «script» и «scriptURI» объекта SqlActivity.

где "ScriptArgument" : "123"

здесь? может заменить значение условия, но не само условие.


Тест 2: Использование параметров работает, когда команда задана только с помощью опции «script»

insert into #{myTable} select * from source where source.id = ?; - Работает нормально, если используется через ' скрипт '

insert into #{myTable} select * from source where source.id = #{myId};
  • работает отлично, если используется только с помощью опции «script»

где #{myTable}, #{myId} - параметры, значение которых могут быть объявлены в шаблоне.

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-custom-templates.html

( когда вы используете только параметры, убедитесь, что вы удалили неиспользуемые скриптыArguments - в противном случае он все равно будет бросать и ошибка)


FAILED TESTS и inferences:

insert в? выберите * из источника, где source.id =?;

вставить? выберите * из источника, где source.id = '123';

Обе вышеприведенные команды не работают, потому что

Названия таблиц не могут использоваться для заполнителей для аргументов сценария. '?' 's может использоваться только для передачи значений для условия сравнения и значений столбца.


insert into # {myTable} select * from source где source.id = # {мой ID}; - не работает, если используется как «SciptURI»

вставить в tempsdf select * из источника, где source.id = # {myId}; - не работает при использовании с 'ScriptURI'

Выше 2 команды не работают, потому что

Параметры не могут быть оценены, если скрипт хранится в S3.

< / blockquote>

вставить в tempsdf select * из источника, где source.id = $ 1; - не работает с 'scriptURI'

вставить в значения tempsdf ($ 1, $ 2, $ 3); - не работает.

с использованием $ 's - не работает ни в одной комбинации


Другие тесты:

"ScriptArgument" : «123» «ScriptArgument»: «456» «ScriptArgument»: «789»

insert into tempsdf values (?,?,?); - работает как scriptURI, скрипт и переводится на insert into tempsdf values ('123','456','789');

scriptArguments будет следовать порядку, который вы вставляете и заменяет «?» в скрипте.


4
ответ дан jc mannem 27 August 2018 в 08:39
поделиться

в работе shellcommand мы указываем два скриптовых атрибута для acces, используя $ 1 $ 2 в сценарии оболочки (.sh)

"scriptArgument": "'s3: // location_of_unload / # format (минусDays (@ scheduleStartTime, 1 ), 'YYYY / MM / dd / hhmm /')} '", # можно использовать с помощью $ 1" scriptArgument ":"' aws_access_key_id = ????; aws_secret_access_key = ******* '# может быть с помощью $ 2

Я не знаю, будет ли это работать для вас.

1
ответ дан santhoshc 27 August 2018 в 08:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: