`

pentahao

    博客分类:
  • J2EE
 
阅读更多
1 在主报表上 放了很多子报表 子报表采用的是inline风格 子报表里面放了图形和标题之类的 因此要计算下图形加标题的宽和长。把子报表的宽和长也设置那么大。
这样就能在主报表页面上看得到布局了,水平方向和垂直方向都能对齐。
2 图形的柱状图的max-bar-width 1=100% 大于1会自动根据图形宽度自动调整大小. 反之小于1就手动控制其宽度.
3 图形的柱状图的 3D=TRUE 也能显示 SHOW LABLES的值  当它受限制于BAR的宽度 和高度.



最近一直使用Pentaho 的 spoon  进行数据挖掘的ETL数据处理 在使用其中的 "If field value is null "的插件的时候,发现当我的csv 的某个字段值 为空或者null 的时候该判断失效,总不起作用后来google 到 pentahao 的网站看到有人问同样的问题,内容大概如下:
=========================================================================
PDI 3.2 has this new step "If field value is null".

I am trying to use it in a transformation:

Access Input -> Add constants -> If field value is null -> Table output Mapping -> Table output (which is a MySQL table)

For those fields in the MySQL table that accept NULL I'd like to change to UNDEFINED so this step seems ideal.

So in the step I select "Select fields" and specify a handful of fields under the Fields section and specify the "Replace by value" value. I have specified and not specified a "Conversion mask (Date)". Is the Conversion mask necessary? In all cases I still have NULL written into fields in the MySQL table. All the MySQL fields that accept NULL are varchars.

There is not much on this step in the wiki:

http://wiki.pentaho.com/display/EAI/...+value+is+null

A previous post about this step:

http://forums.pentaho.org/showthread.php?t=70745

doesn't conclude with any advice pertaining to this particular step.

Am I doing something wrong?

Thanks in advance.

Cheers
=================================================================================

后来看到一个回复的帖子说这个是个bug 将在3.2 以上版本或者4.0进行更新,而目前能在官网下载的只有3.2.0的版本
那我们该怎么办? 幸好spoon 是开源软件 ,可以下载源代码 并找到 “If field value is null ” 插件所对应的类文件
org.pentaho.di.trans.steps.ifnull.IfNull.java  在  replaceNull 方法设置断点进行跟踪得知 第213行
public void replaceNull(Object[] row, int i) throws Exception
{
 

 
  if(row[i]==null)
  {
   // DO CONVERSION OF THE DEFAULT VALUE ...
   // Entered by user
   ValueMetaInterface targetValueMeta = data.outputRowMeta.getValueMeta(i);
   ValueMetaInterface sourceValueMeta = data.convertRowMeta.getValueMeta(i);
   if(!Const.isEmpty(data.realconversionMask)) sourceValueMeta.setConversionMask(data.realconversionMask);
   row[i] = targetValueMeta.convertData(sourceValueMeta, data.realReplaceByValue);
   }
  
}
当 csv 文件里的某个值虽然为空或者空字符串的时候  Object[] row 的数组里的对象并不为 null  而对象里的值实际上为null
所以我们要利用 ValueMetaInterface.isNull() 来判断,接下来我们修改程序结构 红色部分是修改的
public void replaceNull(Object[] row, int i) throws Exception
{
 
  ValueMetaInterface targetValueMeta = data.outputRowMeta.getValueMeta(i);
  ValueMetaInterface sourceValueMeta = data.convertRowMeta.getValueMeta(i);
 
  if(row[i]==null||sourceValueMeta.isNull(row[i]))
  {
   // DO CONVERSION OF THE DEFAULT VALUE ...
   // Entered by user
   if(!Const.isEmpty(data.realconversionMask)) sourceValueMeta.setConversionMask(data.realconversionMask);
   row[i] = targetValueMeta.convertData(sourceValueMeta, data.realReplaceByValue);
   }
  
}
编译后再次运行 一切正常。
补充,另外请修改 org.pentaho.di.core.row.ValueMeta.java 的
public boolean isNull(Object data) throws KettleValueException 的 2825行
将 原来的 if (((String)value).length()==0) return true;
替换成
          String str=String.valueOf(value); if (str.length()==0) return true;
因为某种情况下String 类型强制转换会造成异常错误,推荐使用 String.valueOf();




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics