ignite自定义函数

Ignite自定义函数注意事项

  1. Customer SQL Function

首先,需要写自定义SQL函数的java类。

注意:1. 定义函数的方法必须是静态的static修饰。

      2. 自定义函数的方法不能重载。

      3. 每个方法必须要用@QuerySqlFunction注释。

      4.当有多个自定义方法时,不能同时在@QuerySqlFunction(alias=’XXX’)中定义别名。

      5. 使用setSqlfunction(‘xxx.class’)注册函数的时候,不能同时注册两个class,如果需要自定义多个函数可以在一个类中定义多个方法。

示例如下:

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.ignite.cache.query.annotations.QuerySqlFunction;

public class addition2{

public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

public static final String MINUTE_PATTERN = "yyyy-MM-dd HH:mm";

public static final String HOUR_PATTERN = "yyyy-MM-dd HH:mm:ss";

public static final String DATE_PATTERN = "yyyy-MM-dd";

public static final String HOUR_FORMAT = "HH:mm:ss";

public static final String MONTH_PATTERN = "yyyy-MM";

public static final String YEAR_PATTERN = "yyyy";

public static final String MINUTE_ONLY_PATTERN = "mm";

public static final String HOUR_ONLY_PATTERN = "HH";

//    @QuerySqlFunction

//    public static double add1(int x,double y){

//          return (double)x+y;

//    }

@QuerySqlFunction

public static int add(int x,int y){

      return x+y;

}

@QuerySqlFunction

public static int chengfa(int x,int y){

      return x*y;

}

@QuerySqlFunction

public static int jianfa(int x,int y){

      return x-y;

}

@QuerySqlFunction

public static double chufa(double x,double y){

      if (y==0)

            System.out.println("被除数不能为零,重新输入:");

      return x/y;

}

@QuerySqlFunction

public static Date todate(String dateTimeString,String pattern) throws ParseException{

      if(pattern==null||pattern==""){

            pattern =DATE_PATTERN;

      }

      SimpleDateFormat sdf = new SimpleDateFormat(pattern);

      return sdf.parse(dateTimeString);

}

}

  1. 注册自定义函数

注意:1.客户端和服务器端需要同时拥有自定义函数的类文件,不然会找不到文件

      2. 采用client方式启动的ignite获取的cacheconfigeration对象和服务器段启动的ignite获取的cacheconfigeration对象是不一样的,客户端必须定义不一样的cache名,且服务器端必须配置sqlchema,不然会报错找不到sqlschema。

      3. 程序中使用setName(‘XXXX’)指定cachename的时候需要与已经存在的cacheName不同。

示例如下:

import java.util.Arrays;

import java.util.List;

import org.apache.ignite.Ignite;

import org.apache.ignite.IgniteCache;

import org.apache.ignite.Ignition;

import org.apache.ignite.cache.CacheAtomicityMode;

import org.apache.ignite.cache.CacheMode;

import org.apache.ignite.cache.query.QueryCursor;

import org.apache.ignite.cache.query.SqlFieldsQuery;

import org.apache.ignite.configuration.CacheConfiguration;

import org.apache.ignite.configuration.IgniteConfiguration;

import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;

import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;

import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;

public class SqlFunction {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           //local ignite connect

                      IgniteConfiguration cfg1 = new IgniteConfiguration();

                      cfg1.setIgniteInstanceName("productinfo_withtime");

                   TcpDiscoverySpi spi = new TcpDiscoverySpi();

                   TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();

                   ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47510"));

                   spi.setIpFinder(ipFinder);

                   cfg1.setDiscoverySpi(spi);

                   cfg1.setClientMode(true);

                   Ignite ignite = Ignition.start(cfg1);       

                   CacheConfiguration ccfg = new CacheConfiguration();

                   ccfg.setName("productinfo1");

                   ccfg.setSqlSchema("productinfo_withtime");

                   ccfg.setSqlFunctionClasses(addition2.class);       

                    IgniteCache cache = ignite.getOrCreateCache(ccfg);

                   SqlFieldsQuery query = new SqlFieldsQuery("SELECT add(number,20) add,chengfa(number,3) chengfa,jianfa(number,3) jianfa,chufa(unitPrice,3) chufa,number,floor(unitPrice) floor,unitPrice,todate(time,'yyyy-MM-dd'),time FROM SALE");

                      QueryCursor<List<?>> cursor=cache.query(query);

                      int i=1;

                      for(List<?> row: cursor){

                      System.out.println("调用add函数后的number数据第"+i+"行为:"+row.get(0)+"\t调用chengfa函数后number的数据为:"+row.get(1)+"\t调用jianfa函数后的number的数据为:"+row.get(2)+"\t调用chufa函数后的unitPrice的数据为:"+row.get(3)+",\tnumber原始数据为:"+row.get(4)+",\t调用内置floor函数后的unitprice的值:"+row.get(5)+",\tunitPrice原始数据为:"+row.get(6)+",\t调用to_date函数后saleDate数据为:"+row.get(7)+",\tsaleDate原始数据为:"+row.get(8));

                            i++;

                      }

                 }

      }

转载于:https://my.oschina.net/zhouwang93/blog/1828055

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值