1.使用kettle设计一个能生成100个取值范围为0到100随机整数的转换。
为了完成该转换,需要使用生成记录控件、生成随机数控件、计算器控件及字段选择控件。控件布局如下图所示
生成记录控件可以在限制框内指定生成记录的个数,具体配置如图所示
生成随机数控件可以用来生成随机种子,生成0到1内的小数,具体配置如图所示。
计算器控件可以用来对获得的小数进行映射,将范围映射到0到100中。首先需要指定一个常量N,值为100,类型为Number,接着将N和随机种子相乘的值存放到新的字段x中。具体配置如图所示。
最后使用字段选择控件,删除多余字段。字段选择控件配置可参考
使用kettle进行日志分析_瑾寰的博客-CSDN博客
最后获得的效果如下图所示:
2.使用kettle设计一个能求数据标准差和均值的转换,输入数据从第一问获取。
在第1问的基础上添加一个单变量统计控件。
单变量统计控件具体配置如下图所示:
在input field中选择需要计算的字段,对于需要输出的字段选择为true,其余为false。最后执行的结果如图所示:
3. 在第2问的基础上设计一个转换,任务是生成一个随机数,并判断它是否处于2中均值的一个标准差内。
为了完成目标,在第二问的基础上还需要使用记录关联(笛卡尔输出)控件和java代码控件,具体布局如下图所示:
其中记录关联控件用来将不同来源的数据连接,具体配置如下:
Java代码控件主要用来进行逻辑判断,判断数据是否满足题目要求,并增加新的字段ans作为结果,具体配置如下:
其中的代码如下:
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { if (first) { first = false; /* TODO: Your code here. (Using info fields) FieldHelper infoField = get(Fields.Info, "info_field_name"); RowSet infoStream = findInfoRowSet("info_stream_tag"); Object[] infoRow = null; int infoRowCount = 0; // Read all rows from info step before calling getRow() method, which returns first row from any // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors. while((infoRow = getRowFrom(infoStream)) != null){ // do something with info data infoRowCount++; } */ } Object[] r = getRow(); if (r == null) { setOutputDone(); return false; } // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large // enough to handle any new fields you are creating in this step. r = createOutputRow(r, data.outputRowMeta.size()); /* TODO: Your code here. (See Sample) // Get the value from an input field String foobar = get(Fields.In, "a_fieldname").getString(r); foobar += "bar";
// Set a value in a new output field get(Fields.Out, "output_fieldname").setValue(r, foobar); */ // Send the row on to the next step. boolean ans = false; double mean = Double.parseDouble(get(Fields.In, "x(mean)").getString(r)); double std = Double.parseDouble(get(Fields.In, "x(stdDev)").getString(r)); double x = Double.parseDouble(get(Fields.In, "x").getString(r)); if(x>=(mean-std) && x<=(mean+std)){ ans = true; } System.out.println("hha"); ans = true; get(Fields.Out, "ans").setValue(r, ans); putRow(data.outputRowMeta, r); return true; } |
运行结果如下图所示: