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