终于解决kylin连接phoenix部分日期转换错误的问题了,就是强制使用字符串格式:
1.kylin.properties中配置
#### JDBC Data Source
kylin.source.default=8
kylin.source.jdbc.connection-url=jdbc:phoenix:zk01,zk02,zk03:2181
kylin.source.jdbc.driver=org.apache.phoenix.jdbc.PhoenixDriver
kylin.source.jdbc.dialect=default
kylin.source.jdbc.user=admin
kylin.source.jdbc.pass=admin123456
kylin.source.jdbc.sqoop-home=/home/install/sqoop
kylin.source.jdbc.filed-delimiter=|
## 要加上一下两行解决`字符(ESC下面那个)的问题
kylin.source.hive.quote-enabled=false
kylin.source.quote.character=
2.自己编译sqoop,添加数据库连接参数
isNamespaceMappingEnabled: true
修改编译好的sqoop-1.4.7.jar,见附件sqoop-1.4.7.jar
3.修改kylin源码编译
1)org.apache.kylin.source.jdbc.JdbcExplorer
private ColumnDesc[] extractColumnFromMeta(ResultSet meta) throws SQLException {
List<ColumnDesc> columns = new ArrayList<>(); while (meta.next()) {
String cname = meta.getString("COLUMN_NAME");
int type = meta.getInt("DATA_TYPE");
int csize = meta.getInt("COLUMN_SIZE");
int digits = meta.getInt("DECIMAL_DIGITS");
int pos = meta.getInt("ORDINAL_POSITION");
String remarks = meta.getString("REMARKS"); ColumnDesc cdesc = new ColumnDesc();
cdesc.setName(cname.toUpperCase(Locale.ROOT)); String kylinType = SqlUtil.jdbcTypeToKylinDataType(type);
int precision = (SqlUtil.isPrecisionApplicable(kylinType) && csize > 0) ? csize : -1;
int scale = (SqlUtil.isScaleApplicable(kylinType) && digits > 0) ? digits : -1;
if(Types.DATE==type||Types.TIME==type||Types.TIMESTAMP==type){ kylinType = "varchar";
scale = -1;
precision=20;
} cdesc.setDatatype(new DataType(kylinType, precision, scale).toString());
cdesc.setId(String.valueOf(pos));
cdesc.setComment(remarks);
columns.add(cdesc);
} return columns.toArray(new ColumnDesc[columns.size()]);
}
添加了以下
if(Types.DATE==type||Types.TIME==type||Types.TIMESTAMP==type){ kylinType = "varchar"; scale = -1; precision=20; }
2)org.apache.kylin.source.jdbc.extensible.JdbcExplorer:loadTableMetadata方法
int precision = (SqlUtil.isPrecisionApplicable(kylinType) && csize > 0) ? csize : -1;
int scale = (SqlUtil.isScaleApplicable(kylinType) && digits > 0) ? digits : -1;
if(Types.DATE==type||Types.TIME==type||Types.TIMESTAMP==type){ kylinType = "varchar";
scale = -1;
precision = 20;
} cdesc.setDatatype(new DataType(kylinType, precision, scale).toString());
cdesc.setId(String.valueOf(pos));
cdesc.setComment(remarks);
columnDescs.add(cdesc);
编译成功后用KYLIN_SOURCE_PATH\source-jdbc\target\classes\org\apache\kylin\source\jdbc下的class文件把KYLIN_HOME/tomcat/webapps/kylin.war/WEB-INF/lib中的kylin-source-jdbc-3...jar里面的相对应两个JdbcExplorer.class文件替换掉,然后重启kylin查看日期是否正确
对比一下修改前后的查询结果:
修改前:
修改后:
在此记录一下,有同道中人遇到也可以提供个参考
既然不支持timestamp或者date,就只能使用string了
还是有问题,应该是构建CUBE时时间转换出问题了