ignite自定义函数
2019獨角獸企業重金招聘Python工程師標準>>>
Ignite自定義函數注意事項
首先,需要寫自定義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.客戶端和服務器端需要同時擁有自定義函數的類文件,不然會找不到文件
??? ? 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
總結
以上是生活随笔為你收集整理的ignite自定义函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 2065 红色病毒问题(生成函数
- 下一篇: orcal 数据库 maven架构 s