我想动态地将字段(或新列)添加到Kettle中的结果输出行。
花了几个小时阅读froum帖子并且他的脚本文档做得不好,我想知道Stackoverflow是否会有任何帮助。
答案 0 :(得分:10)
我们可以使用以下步骤生成动态列生成:
答案 1 :(得分:1)
您的输入值如何传递给SQL查询?如果它们是变量,那么只需将表输入步骤传递给“获取变量”步骤,然后以这种方式获取新列。
或者,您可以使用计算器或添加常量来添加列。
或者您甚至可以使用“获取系统信息”步骤获取命令行参数和日期等。
答案 2 :(得分:1)
首先,让我给你一个用户定义的Java类步骤的代码片段:
private int fieldToHashGeoIndex;
private int fieldToHashHeadIndex;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
Object[] r=getRow();
if (r==null)
{
setOutputDone();
return false;
}
if (first) {
fieldToHashGeoIndex = getInputRowMeta().indexOfValue(getParameter("FIELD_TO_HASH_GEO"));
if (fieldToHashGeoIndex<0) {
throw new KettleException("Field to hash not found in the input row, check parameter 'FIELD_TO_HASH_GEO'!");
}
fieldToHashHeadIndex = getInputRowMeta().indexOfValue(getParameter("FIELD_TO_HASH_HEAD"));
if (fieldToHashHeadIndex<0) {
throw new KettleException("Field to hash not found in the input row, check parameter 'FIELD_TO_HASH_HEAD'!");
}
first=false;
}
Object[] outputRowData = RowDataUtil.resizeArray(r, data.outputRowMeta.size());
int outputIndex = getInputRowMeta().size();
String fieldToHashGeo = getInputRowMeta().getString(r, fieldToHashGeoIndex);
String fieldToHashHead = getInputRowMeta().getString(r, fieldToHashHeadIndex);
outputRowData[outputIndex++] = MurmurHash.hash64(fieldToHashGeo);
outputRowData[outputIndex++] = MurmurHash.hash64(fieldToHashHead);
putRow(data.outputRowMeta, outputRowData);
return true;
}
现在,通常您从步骤的配置中配置outputRowMeta
,但也许您可以在代码中修改它。这应该允许您在代码中指定其他字段。
作为替代方案,您可以通过在“field1”,“field2”等步骤上定义固定输出字段并在其他位置跟踪字段的名称来锁定变量字段。您可能必须创建String类型的所有字段,然后再进行自己的类型调整。
现在我想到了它,但是变量输出字段可能会导致麻烦:您必须非常小心后续步骤中的操作,以避免因类型不匹配或缺少字段而导致错误。
答案 3 :(得分:-1)
您可以使用javascript动态生成列和行。阅读这篇关于这个主题的优秀文章: