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.queryWithSqlMassage(
> >>>> > 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());
> >>>> > >     }
> >>>> > > }
> >>>> >
> >>>>
> >>>
> >>>
> >>
> >
>

Reply via email to