首页编程java编程java udf是什么,java可以实现mysql udf吗

java udf是什么,java可以实现mysql udf吗

编程之家2023-10-14116次浏览

很多朋友对于java udf是什么和java可以实现mysql udf吗不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

java udf是什么,java可以实现mysql udf吗

java生成唯一标识符有什么用

有时我们不依赖于数据库中自动递增的字段产生唯一ID,比如多表同一字段需要统一一个唯一ID,这时就需要用程序来生成一个唯一的全局ID,然后在数据库事务中同时插入到多章表中实现同步.

在java中有个类工具很好的实现产生唯一ID(UUID),但是由数字和字母及中划线组成的,故数据库字段应该设置为char并相应的建立索引.

UUID是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier).

java udf是什么,java可以实现mysql udf吗

指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个 UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers).

在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx- xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x是 0-9或 a-f范围内的一个十六进制的数字.而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)

,可以从cflib下载CreateGUID() UDF进行转换.

java udf是什么,java可以实现mysql udf吗

使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显.

关于UUID的更多信息可以多google一下.

Java生成UUID

UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字.由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.

在Java中生成UUID主要有以下几种方式:

JDK1.5

如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID:

java.util.UUID,直接调用即可.

UUID uuid= UUID.randomUUID();

String s= UUID.randomUUID().toString();//用来生成数据库的主键id非常不错..

Java代码

package com.taobao.tddl.client.util;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.net.InetAddress;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import java.util.concurrent.atomic.AtomicLong;

import java.util.concurrent.locks.ReentrantLock;

/**

*@author huangshang

*

*/

public class UniqId{

private static char[] digits={'0','1','2','3','4','5','6','7',

'8','9','a','b','c','d','e','f'};

private static Map<Character, Integer> rDigits= new HashMap<Character, Integer>(

16);

static{

for(int i= 0; i< digits.length;++i){

rDigits.put(digits[i], i);

}

}

private static UniqId me= new UniqId();

private String hostAddr;

private Random random= new SecureRandom();

private MessageDigest mHasher;

private UniqTimer timer= new UniqTimer();

private ReentrantLock opLock= new ReentrantLock();

private UniqId(){

try{

InetAddress addr= InetAddress.getLocalHost();

hostAddr= addr.getHostAddress();

} catch(IOException e){

hostAddr= String.valueOf(System.currentTimeMillis());

}

if(hostAddr== null|| hostAddr.length()== 0

||"127.0.0.1".equals(hostAddr)){

hostAddr= String.valueOf(System.currentTimeMillis());

}

try{

mHasher= MessageDigest.getInstance("MD5");

} catch(NoSuchAlgorithmException nex){

mHasher= null;

}

}

/**

*获取UniqID实例

*

*@return UniqId

*/

public static UniqId getInstance(){

return me;

}

/**

*获得不会重复的毫秒数

*

*@return

*/

public long getUniqTime(){

return timer.getCurrentTime();

}

/**

*获得UniqId

*

*@return uniqTime-randomNum-hostAddr-threadId

*/

public String getUniqID(){

StringBuffer sb= new StringBuffer();

long t= timer.getCurrentTime();

sb.append(t);

sb.append("-");

sb.append(random.nextInt(8999)+ 1000);

sb.append("-");

sb.append(hostAddr);

sb.append("-");

sb.append(Thread.currentThread().hashCode());

return sb.toString();

}

/**

*获取MD5之后的uniqId string

*

*@return uniqId md5 string

*/

public String getUniqIDHashString(){

return hashString(getUniqID());

}

/**

*获取MD5之后的uniqId

*

*@return byte[16]

*/

public byte[] getUniqIDHash(){

return hash(getUniqID());

}

/**

*对字符串进行md5

*

*@param str

*@return md5 byte[16]

*/

public byte[] hash(String str){

opLock.lock();

try{

byte[] bt= mHasher.digest(str.getBytes("UTF-8"));

if(null== bt|| bt.length!= 16){

throw new IllegalArgumentException("md5 need");

}

return bt;

} catch(UnsupportedEncodingException e){

throw new RuntimeException("unsupported utf-8 encoding", e);

} finally{

opLock.unlock();

}

}

/**

*对二进制数据进行md5

*

*@param str

*@return md5 byte[16]

*/

public byte[] hash(byte[] data){

opLock.lock();

try{

byte[] bt= mHasher.digest(data);

if(null== bt|| bt.length!= 16){

throw new IllegalArgumentException("md5 need");

}

return bt;

} finally{

opLock.unlock();

}

}

/**

*对字符串进行md5 string

*

*@param str

*@return md5 string

*/

public String hashString(String str){

byte[] bt= hash(str);

return bytes2string(bt);

}

/**

*对字节流进行md5 string

*

*@param str

*@return md5 string

*/

public String hashBytes(byte[] str){

byte[] bt= hash(str);

return bytes2string(bt);

}

/**

*将一个字节数组转化为可见的字符串

*

*@param bt

*@return

*/

public String bytes2string(byte[] bt){

int l= bt.length;

char[] out= new char[l<< 1];

for(int i= 0, j= 0; i< l; i++){

out[j++]= digits[(0xF0& bt[i])>>> 4];

out[j++]= digits[0x0F& bt[i]];

}

return new String(out);

}

/**

*将字符串转换为bytes

*

*@param str

*@return byte[]

*/

public byte[] string2bytes(String str){

if(null== str){

throw new NullPointerException("参数不能为空");

}

if(str.length()!= 32){

throw new IllegalArgumentException("字符串长度必须是32");

}

byte[] data= new byte[16];

char[] chs= str.toCharArray();

for(int i= 0; i< 16;++i){

int h= rDigits.get(chs[i* 2]).intValue();

int l= rDigits.get(chs[i* 2+ 1]).intValue();

data[i]=(byte)((h& 0x0F)<< 4|(l& 0x0F));

}

return data;

}

/**

*实现不重复的时间

*

*@author dogun

*/

private static class UniqTimer{

private AtomicLong lastTime= new AtomicLong(System.currentTimeMillis());

public long getCurrentTime(){

return this.lastTime.incrementAndGet();

}

}

}

java可以实现mysql udf吗

一个使用mysql UDF编写mysql扩展函数的例子

#include<mysql.h>

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<errno.h>

#include<unistd.h>

#include<stdint.h>

/*资源分配*/

my_bool myfun_init(UDF_INIT*initid, UDF_ARGS*args, char*message);

/*自定义函数*/

char*myfun(UDF_INIT*initid, UDF_ARGS*args, char*result, unsigned long*length, char*is_null, char*error);

/*资源回收*/

void myfun_deinit(UDF_INIT*initid);

/*

参数说明:

UDF_INT*initid

UDF_INIT指针可以用于将分配好的资源传递给其他函数使用。

UDF_ARG*args

UDF_ARG指针

char*message

出错信息指针

返回值 0成功, 1失败

针对UFD_INT和UDF_ARG的成员做一个简单说明。

typedef struct st_udf_args

{

unsigned int arg_count;参数个数

enum Item_result*arg_type;参数类型

char**args;参数指针

unsigned long*lengths;参数长度

char*maybe_null;是否可以为空,1表示可以为空

char**attributes;参数属性的指针

unsigned long*attribute_lengths;参数属性的指针指向内容的长度

void*extension;扩展指针

} UDF_ARGS;

typedef struct st_udf_init

{

my_bool maybe_null; 1表示返回值可以为空

unsigned int decimals;可以用来设置double类型小数点后的长度

unsigned long max_length;自定义字符串函数返回结果的最大长度

char*ptr;字符串指针一般init里面分配的内存可以把地址给ptr,用于传递到其他函数,比如deinit里面释放分配的内存

my_bool const_item;函数是否返回固定结果

void*extension;扩展指针

} UDF_INIT;

*/

/* init函数在myfun函数执行前调用*/

my_bool myfun_init(UDF_INIT*initid, UDF_ARGS*args, char*message)

{

char*pstr;

if(args->arg_count!= 1|| args->arg_type[0]!= STRING_RESULT){

/*检测参数个数和参数类型*/

strncpy(message," USAGE: myfun('<schema>').", MYSQL_ERRMSG_SIZE);

return 1;

}

pstr= malloc(sizeof(char)* 128);

/*强制参数为指针类型*/

args->arg_type[0]= STRING_RESULT;

initid->ptr=(char*)total_bytes;

return 0;

}

/*

参数说明:

UDF_INT*initid

同init函数

UDF_ARG*args

用于读取穿进来参数的信息:传入的值,传入值的长度,类型等等,具体看上面结构体的说明

*result

保留参数

*length

用于设置返回值的长度

*is_null

是否为空

*error

如果设置为1自定义函数将不被再调用

RETURNS

字符串指针

*/

char*myfun(UDF_INIT*initid, UDF_ARGS*args, char*result, unsigned long*length, char*is_null, char*error)

{

char*pstr=(char*)initid->ptr;

strcpy(pstr,"hello");

memcpy(pstr+strlen(pstr),args->args[0],args->lengths[0]);

/*可以试试

sprintf(pstr,“hello%s”, args->args[0]);

可以深入理解args->lengths的作用了*/

return(result);

}

/* deinit函数在myfun函数执行完调用*/

void myfun_deinit(UDF_INIT*initid)

{

char*total_bytes= initid->ptr;

/*释放内存*/

free(total_bytes);

return;

}

什么是UUID,Java中怎么产生UUID

UUID是通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

生成UUID的方法:

public static String getUUID32(){ String uuid= UUID.randomUUID().toString().replace("-","").toLowerCase(); return uuid;// return UUID.randomUUID().toString().replace("-","").toLowerCase();}

注:因为一般数据库主键为String类型,所以接收类型为String,生成的uuid数据包含-,所以要去掉-,故UUID.randomUUID().toString().replace("-","").toLowerCase()。

扩展资料:

UUID由以下几部分的组合:

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

(2)时钟序列。

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)。

其中每个 x是 0-9或 a-f范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-4-12),可以从cflib下载CreateGUID() UDF进行转换。

参考资料:百度百科-UUID

如何将java类转换成UDF中的jar包

首先我们需要建立java类,如下:

package cn.infotelcom.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class Get_sum_flow extends UDF

{

public String evaluate(String upload, String download)

{

return"";

}

}

2.注意package的路径,在home目录下建立文件夹cn/infotelcom/udf,并将java类放到这边。

3.建立文件夹cn/infotelcom/jar,并上传jar包hadoop-core-1.2.1.jar、hive-exec-0.7.1.jar

4.在home目录下面执行命令javac-classpath/data2/u_lx_ctag/cn/infotelcom/jar/hadoop-core-1.2.1.jar:/data2/u_lx_ctag/cn/infotelcom/jar/hive-exec-0.7.1.jar/data2/u_lx_ctag/cn/infotelcom/udf/Get_sum_flow.java目的:编译java文件,产生class文件,用于生成jar包

5.在home目录下执行jar-cvf Get_sum_flow.jar cn/infotelcom/udf/Get_sum_flow.class,此命令的作用是生成jar包,jar包所在的目录是home根目录下面

6.在hive中加载jar包:add jar/data2/u_lx_ctag/UDF_FUNCTION/Get_sum_flow.jar;【jar包的绝对路径】

7.创建函数:CREATE TEMPORARY FUNCTION get_sum_flow AS'cn.infotelcom.udf.Get_sum_flow';

8.调用函数:select get_sum_flow(upload_bytes,download_bytes) from dual;

关于本次java udf是什么和java可以实现mysql udf吗的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

qq500人群(500人群转让群主条件)java使用什么生成日志?java中使用日志主要分为哪几个步骤