Kettle有“行规范化器”和“行规范化器”步骤,例如
http://wiki.pentaho.com/display/EAI/Row+Normalizer
但它们要求您手动配置非规范化表中的字段。我不明白这是如何实际使用的,因为非规范化表中的字段数取决于规范化表中的行数,这是动态的。例如。在他们的示例中,非规范化输入表中有三个产品用于三个产品,用户必须手动告诉转换如何处理每个产品。但在实际应用中,产品数量将动态变化。因此,此转换仅适用于一个表,在某个时刻。具有不同列数的任何内容都将失败。
我有几十个或几百个非规范化的输入文件,看起来非常像他们的例子,所有这些都有不同的列数。
答案 0 :(得分:0)
我在非规范化方面遇到了类似的问题。我有一个/etc/group
文件,其结构类似于group:gid:member1,member2,....
,我使用User Defined Java Class
组件对其进行了反规范化,因此我最终得到了字段group,gid,member
。我知道你需要另一个方向,但对你来说这可能是一个很好的起点。这是来源:
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// boilerplate
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
if(first)
first = false;
String tmp = get(Fields.In, "members").getString(r);
if(null==tmp)
return true;
String accounts[] = tmp.split(",");
for(int i=0; i<accounts.length; ++i){
Object[] out_row = RowDataUtil.allocateRowData(data.outputRowMeta.size());
for (int j=0; j<r.length; ++j)
out_row[j] = r[j];
String account = accounts[i];
get(Fields.Out, "account").setValue(out_row,account);
putRow(data.outputRowMeta, out_row);
}
return true;
}