It doesn't take effect[image: 内嵌图片 1] 2018-01-31 10:59 GMT+08:00 yongjie zhao <[email protected]>:
> you can try this expression in Superset column editor > ``` > (SUBSTRING(CAST(DIM_INTEGER as VARCHAR) FROM 1 FOR 4) || '-' || > SUBSTRING(CAST(DIM_INTEGER as VARCHAR) FROM 5 FOR 2) || '-' || > SUBSTRING(CAST(DIM_INTEGER as VARCHAR) FROM 7 FOR 2) ) > ``` > > > > > On Wed, Jan 31, 2018 at 9:36 AM, 杨浩 <[email protected]> wrote: > >> int, such as 20180130 >> >> 2018-01-30 21:39 GMT+08:00 yongjie zhao <[email protected]>: >> >> > What is your type of dimension, date? varchar? >> > >> > On Tue, Jan 30, 2018 at 6:17 PM, 杨浩 <[email protected]> wrote: >> > >> > > If the format of "DATE" is YYYYMMDD,and superset changes it to format >> > > YYYY-MM-DD, so we should use the UDF >> > > [image: 内嵌图片 1] >> > > >> > > 2018-01-30 16:00 GMT+08:00 杨浩 <[email protected]>: >> > > >> > >> Or the problem may be that how should we write UDF to support >> function >> > in >> > >> filter position >> > >> >> > >> 2018-01-30 15:45 GMT+08:00 杨浩 <[email protected]>: >> > >> >> > >>> Do you mean sqllab in superset? We have solved relevant problems, >> > except >> > >>> for the exception supplied by me >> > >>> >> > >>> 2018-01-30 15:38 GMT+08:00 yongjie zhao <[email protected]>: >> > >>> >> > >>>> Are you in sqllab write this SQL? >> > >>>> >> > >>>> On Tue, Jan 30, 2018 at 2:57 PM, 杨浩 <[email protected]> wrote: >> > >>>> >> > >>>> > kylin developers >> > >>>> > We have used superset as BI tool. Superset uses to_date to >> > >>>> represent >> > >>>> > time, and we add the to_date udf in our env. A query may be like >> > >>>> select *** >> > >>>> > from table_1 where 'DATE' >= TO_DATE('2017-12-31 00:00:00', >> > >>>> 'yyyy-MM-dd'). >> > >>>> > The executing result is right, but the query will not use kylin >> > >>>> optimize, >> > >>>> > because some error has happened , and every query will scan all >> > hbase >> > >>>> > table. How should we add the udf ? >> > >>>> > >> > >>>> > 2018-01-30 13:10:03,400 WARN [Query >> > >>>> > >> f029cbac-2aba-456c-b857-f65c8661e39c-90] >> > >>>> > >> filter.BuiltInFunctionTupleFilter:143 : Reflection failed for >> > >>>> > methodParams. >> > >>>> > > >> > >>>> > > java.lang.NullPointerException >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.metadata.filter.BuiltInFunctionTupleFilter. >> > >>>> addChild( >> > >>>> > BuiltInFunctionTupleFilter.java:136) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.metadata.filter.TupleFilterSerializer.deser >> > >>>> ialize( >> > >>>> > TupleFilterSerializer.java:146) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.storage.gtrecord.CubeSegmentScanner.< >> > >>>> > init>(CubeSegmentScanner.java:65) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.storage.gtrecord.GTCubeStorageQueryBase. >> search( >> > >>>> > GTCubeStorageQueryBase.java:93) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.query.enumerator.OLAPEnumerator. >> > >>>> > queryStorage(OLAPEnumerator.java:117) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.query.enumerator.OLAPEnumerator. >> > >>>> > moveNext(OLAPEnumerator.java:64) >> > >>>> > > >> > >>>> > > at Baz$1$1.moveNext(Unknown Source) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.linq4j.EnumerableDefaults.groupBy_( >> > >>>> > EnumerableDefaults.java:826) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.linq4j.EnumerableDefaults.groupBy( >> > >>>> > EnumerableDefaults.java:761) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.linq4j.DefaultEnumerable.groupBy( >> > >>>> > DefaultEnumerable.java:302) >> > >>>> > > >> > >>>> > > at Baz.bind(Unknown Source) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enum >> > >>>> erable( >> > >>>> > CalcitePrepare.java:335) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable( >> > >>>> > CalciteConnectionImpl.java:294) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteMetaImpl._createIterable( >> > >>>> > CalciteMetaImpl.java:559) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteMetaImpl.createIterable( >> > >>>> > CalciteMetaImpl.java:550) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.avatica.AvaticaResultSet.execute( >> > >>>> > AvaticaResultSet.java:204) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteResultSet.execute( >> > >>>> > CalciteResultSet.java:67) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteResultSet.execute( >> > >>>> > CalciteResultSet.java:44) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.avatica.AvaticaConnection$1.execute( >> > >>>> > AvaticaConnection.java:630) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute( >> > >>>> > CalciteMetaImpl.java:607) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecu >> > >>>> teInternal( >> > >>>> > AvaticaConnection.java:638) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.avatica.AvaticaStatement.executeInternal( >> > >>>> > AvaticaStatement.java:149) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.calcite.avatica.AvaticaStatement.executeQuery( >> > >>>> > AvaticaStatement.java:218) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.rest.service.QueryService.execute( >> > >>>> > QueryService.java:845) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.rest.service.QueryService.queryWithSqlMassa >> ge( >> > >>>> > QueryService.java:572) >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.rest.service.QueryService.query(QueryServic >> > >>>> e.java:181) >> > >>>> >> > >>>> > > >> > >>>> > > at >> > >>>> > >> org.apache.kylin.rest.service.QueryService.doQueryWithCache( >> > >>>> > QueryService.java:428) >> > >>>> > > >> > >>>> > > >> > >>>> > ToDateUDF likes this, and I have adding it on >> > KylinConfigBase.getUDFs >> > >>>> > >> > >>>> > >> > >>>> > public class ToDateUDF { >> > >>>> > > private static final Logger logger = >> > >>>> > > LoggerFactory.getLogger(ToDateUDF.class); >> > >>>> > > public String eval(String sourceDateStr, String >> > >>>> sourceDateFormat) { >> > >>>> > > sourceDateStr = sourceDateStr.replaceAll("'", >> "").trim(); >> > >>>> > > sourceDateFormat = sourceDateFormat.replaceAll("'", >> > >>>> "").trim(); >> > >>>> > > try { >> > >>>> > > SimpleDateFormat dateFormat = new >> > >>>> > > SimpleDateFormat(sourceDateFormat); >> > >>>> > > long ts = dateFormat.parse(sourceDateStr >> ).getTime(); >> > >>>> > > return getFormatTime(ts, "yyyyMMdd"); >> > >>>> > > } catch (ParseException e) { >> > >>>> > > logger.error("parse error", e); >> > >>>> > > logger.error("sourceDateStr:{ >> },sourceDateFormat:{}", >> > >>>> > > sourceDateStr, sourceDateFormat); >> > >>>> > > return ""; >> > >>>> > > } >> > >>>> > > } >> > >>>> > > public static String getFormatTime(long timeStamp, String >> > >>>> format) { >> > >>>> > > if (StringUtils.isBlank(format)) { >> > >>>> > > format = "yyyyMMdd"; >> > >>>> > > } >> > >>>> > > Calendar cal = Calendar.getInstance(); >> > >>>> > > SimpleDateFormat formatter = new >> SimpleDateFormat(format); >> > >>>> > > cal.setTimeInMillis(timeStamp); >> > >>>> > > return formatter.format(cal.getTime()); >> > >>>> > > } >> > >>>> > > } >> > >>>> > >> > >>>> >> > >>> >> > >>> >> > >> >> > > >> > >> > >
