Ignite自定义函数注意事项

简介: 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.客户端和服务器端需要同时拥有自定义函数的类文件,不然会找不到文件

    1. 采用client方式启动的ignite获取的cacheconfigeration对象和服务器段启动的ignite获取的cacheconfigeration对象是不一样的,客户端必须定义不一样的cache名,且服务器端必须配置sqlchema,不然会报错找不到sqlschema。
    2. 程序中使用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++;
            }
        }
}
相关文章
|
3月前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之编写UDF(用户自定义函数)时,报错:找不到主类,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
102 1
|
4月前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之建了一个python 的 UDF脚本,生成函数引用总是说类不存在,是什么导致的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4月前
|
分布式计算 大数据 调度
MaxCompute产品使用问题之为什么用python写的udf函数跑起来比本地还要慢
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
113 2
Hive函数全解——思维导图 + 七种函数类型
|
5月前
|
SQL Java 流计算
Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
【1月更文挑战第1天】【1月更文挑战第2篇】Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
288 0
|
5月前
|
SQL Java 程序员
Hive反射函数的使用-程序员是怎么学UDF函数的
Hive反射函数的使用-程序员是怎么学UDF函数的
38 0
|
5月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之在 DataWorks 中的 ODPS UDF(User-Defined Function,用户自定义函数)中,支持不定长参数如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
66 0
|
SQL 分布式计算 Java
浅析 hive udaf 的正确编写方式- 论姿势的重要性-系列四-如何直接访问metastore service(附源码)
浅析 hive udaf 的正确编写方式- 论姿势的重要性-系列四-如何直接访问metastore service(附源码)
|
5月前
|
分布式计算 DataWorks 大数据
maxcompute函数问题之自定义函数报错如何解决
MaxCompute函数包括内置函数和自定义函数(UDF),它们用于在MaxCompute平台上执行数据处理和分析任务;本合集将介绍MaxCompute函数的使用方法、函数编写和优化技巧,以及常见的函数错误和解决途径。
|
5月前
|
消息中间件 SQL Java
Flink报错问题之调用udf时报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。