我有一个场景使用kettle将参数从pentaho cde传递到pentaho数据集成,然后使用PDI中传递的参数更新表。如何传递参数并在 PDI 中获取传递的参数?
提前致谢!!!
我有一个场景使用kettle将参数从pentaho cde传递到pentaho数据集成,然后使用PDI中传递的参数更新表。如何传递参数并在 PDI 中获取传递的参数?
提前致谢!!!
您可以这样做,或者您可以只创建一个 CDA 数据源,该数据源采用转换中定义的参数。
参数通过 URL 上常用的 ¶mYOURPARAMNAME=x 语法传递给 CDA。
在转换中,您使用获取变量步骤获取参数。
我错过了什么?
您将需要使用 Pentaho 插件生成器 SPARKL。
有了它,您可以将转换上传为可调用端点,并使用 CDE 仪表板来调用它。
首先,您需要一个需要参数的转换。在进行更高级的转换之前,您可以先进行测试:
定义参数并使用 Get Variables 步骤获取
其次,您将在 SPARKL 上创建一个新插件。
为您的插件命名并为其添加一个kettle端点。如果您现在查看您的 pentaho-solutions/system 文件夹,您将拥有一个带有插件名称的新文件夹。打开它并在子文件夹中找到 ktr 文件以将其替换为您的转换。
最后一步是将新仪表板添加到您的插件并进行编辑。如果您现在转到数据源选项卡,请注意名称中带有“端点”的数据源。我们将通过代码访问它们,但很高兴知道它们在这里,因此您也可以从中读取数据,而不仅仅是输入数据。
使用以下代码将新的 javascript 资源添加到 CDE 布局中:
var myPluginName = {};
(function(myself) {
myself.runEndpoint = function (pluginId, endpoint, opts) {
if (!pluginId && !endpoint) {
Dashboards.log('PluginId or endpointName not defined.');
return false
}
var _opts = {
success: function () {
Dashboards.log(pluginId + ': ' + endpoint + ' ran successfully.')
},
error: function (){
Dashboards.log(pluginId + ': error running ' + endpoint + '.')
},
params: {},
systemParams: {},
type: 'POST',
dataType: 'json'
}
var opts = $.extend( {}, _opts, opts);
var url = Dashboards.getWebAppPath() + '/plugin/' + pluginId + '/api/' + endpoint;
function successHandler (json) {
if (json && json.result == false) {
opts.error.apply(this, arguments);
} else {
opts.success.apply( this, arguments );
}
}
function errorHandler () {
opts.error.apply(this, arguments);
}
if (endpoint != 'renderer/refresh' ) {
var ajaxOpts = {
url: url,
async: true,
type: opts.type,
dataType: opts.dataType,
success: successHandler,
error: errorHandler,
data: {}
}
} else {
var ajaxOpts = {
url: url,
async: true,
type: 'GET',
dataType: opts.dataType,
success: successHandler,
error: errorHandler,
data: {}
}
}
_.each( opts.params , function ( value , key) {
ajaxOpts.data['param' + key] = value;
});
_.each(opts.systemParams , function (value , key) {
ajaxOpts.data[key] = value;
});
$.ajax(ajaxOpts)
}
})(myPluginName);
您可以随意更改 myPluginName,但这使您可以使用任何按钮调用该端点发送参数。为此,您可以使用该代码:
myPluginName.runEndpoint(
'myPluginName', // Plugin identifier.
'endpointName', // Put your endpoint name here!
{
params: {
'EXAMPLE_PARAMETER' : foo_bar
},
success: function() { Dashboards.fireChange('refresh', 1); alert('data sent'); },
error: function() { alert('Ops, something went wrong. Check the logs.'); }
})
您可以通过监视双服务器日志来跟踪执行情况。
有关来源的更多信息:
Diethard Steiner - 博客
Francesco Corti - 博客
关注这些家伙,他们很棒。