欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kettle:一个数据库错误发生在从资源库文件读取转换时

程序员文章站 2024-03-22 11:20:58
...

问题情况:
  现场反应导入一个资源库脚本后,打开导入的转换再保存后,再次打开报错:一个数据库错误发生在从资源库文件读取转换时

  先贴日志吧(手输的,将就了):
nullpointexception:
at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryStepDelegate.loadStepAttributesMap(KettleDatabaseRepositoryStepDelegate.java:441)

  先打开代码看看,发现是步骤属性读取为空。

  private Map<String, Map<String, String>> loadStepAttributesMap( ObjectId stepId ) throws KettleException {
    Map<String, Map<String, String>> attributesMap = new HashMap<String, Map<String, String>>();

    List<Object[]> attributeRows = repository.connectionDelegate.getStepAttributesBuffer();
    RowMetaInterface rowMeta = repository.connectionDelegate.getStepAttributesRowMeta();
    for ( Object[] attributeRow : attributeRows ) {//此处是441行
      String code = rowMeta.getString( attributeRow, KettleDatabaseRepository.FIELD_STEP_ATTRIBUTE_CODE, null );
      if ( code != null && code.startsWith( STEP_ATTRIBUTE_PREFIX ) ) {
        String value =
          rowMeta.getString( attributeRow, KettleDatabaseRepository.FIELD_STEP_ATTRIBUTE_VALUE_STR, null );
        if ( value != null ) {
          code = code.substring( STEP_ATTRIBUTE_PREFIX.length() );
          int tabIndex = code.indexOf( '\t' );
          if ( tabIndex > 0 ) {
            String groupName = code.substring( 0, tabIndex );
            String key = code.substring( tabIndex + 1 );
            Map<String, String> attributes = attributesMap.get( groupName );
            if ( attributes == null ) {
              attributes = new HashMap<String, String>();
              attributesMap.put( groupName, attributes );
            }
            attributes.put( key, value );
          }
        }
      }
    }

    return attributesMap;
  }
}

  怀疑是sql执行不成功,进一步怀疑导入的资源库脚本中表名和字段名大小写有问题。让现场把字段名和表名全部改成大写(可以通过navicat的数据传输功能,或者notepad++的正则表达式批量替换功能把小写标识符转换成大写)。

  现场改完,发现打开一个已有的转换,再保存后再打开还是报错,然后我让他们新建个转换,打开看看报错不,现场反馈出现乱码,发现数据库编码有问题,于是修改mysql配置文件character_set_server=utf8,重启数据库,再次导入资源库,问题消失。

  虽然这个bug,没什么技术含量,但是现场环境跟踪bug很困难,还是记下来,免得下次碰到忘掉。

相关标签: etl