我想在 Kettle 的结果输出行中动态添加字段(或新列)。
在花了几个小时阅读来自帖子并且他的脚本文档做得不太好之后,我想知道 Stackoverflow 是否会有所帮助。
我们可以使用以下步骤来生成动态列生成:
您的输入值是如何传递给 SQL 查询的?如果它们是变量,那么只需将表输入步骤传递给“获取变量”步骤并以这种方式获取新列。
或者,您可以使用计算器添加列或添加常量。
或者您甚至可以使用“获取系统信息”步骤来获取命令行参数和日期等。
首先,让我给你一个我在用户定义的 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 类型的所有字段,然后再进行自己的类型调整。
现在我想起来了,可变的输出字段可能会导致麻烦:您必须非常小心您在后面的步骤中所做的事情,以避免由于类型不匹配或缺少字段而导致错误。