impala可以自定义函数吗,怎么做?

2020-11-16 10:55发布

5条回答
那些年很冒险的梦。
2楼 · 2020-11-16 14:01
  1. 创建一个Maven工程Hive

  2. 2

    自定义函数导入依赖

    impala怎样自定义函数

  3. 3

    自定义函数创建一个类

    impala怎样自定义函数

  4. 4

    打成jar包上传到服务器/opt/module/jars/udf.jar

  5. 5

    将jar包上传到hdfs的指定目录

    hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /

  6. 6

    创建自定义函数

    impala怎样自定义函数

  7. 7

    使用自定义函数

    impala怎样自定义函数

  8. 8

    通过show functions查看自定义的函数


浅浅77
3楼 · 2020-11-16 15:07
  1. 创建一个Maven工程Hive

  2. 自定义函数导入依赖

    impala怎样自定义函数

  3. 自定义函数创建一个类

    impala怎样自定义函数

  4. 打成jar包上传到服务器/opt/module/jars/udf.jar

  5. 将jar包上传到hdfs的指定目录

    hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /

  6. 创建自定义函数

    impala怎样自定义函数

  7. 使用自定义函数

    impala怎样自定义函数

  8. 通过show functions查看自定义的函数

    impala怎样自定义函数

小猪仔
4楼 · 2020-11-17 09:47

UDF实现要点:

  • 根据集群中Hive的版本导入对应版本的hive-exec.jar

  • 自定义UDF类要继承接口UDF

  • 实现evaluate()方法

1、需要用到的依赖:


      
          org.apache.hive
          hive-exec
          1.1.0
      
1234567

2、自定义UDF类:

package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
  public String evaluate (String s) {
       if (s == null) {
          return null;
      }
        return s.toLowerCase();
  }
}12345678910

3、打成jar包上传到服务器/root/jars/ hive_udf-0.0.1-SNAPSHOT.jar
4、将jar包上传到hdfs的指定目录

hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /impala_udf/1

5、注册函数

[hadoop103:21000] > create function mylower(string) returns string location 'hdfs://impala_udf/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.impala.udf.mylower_udf';1

6、使用自定义函数

[hadoop103:21000] > select ename, mylower(ename) from emp;1

7、通过show functions查看自定义的函数

[hadoop103:21000] > show functions;
 
Query: show functions
 
+-------------+-----------------+-------------+---------------+
 
| return type | signature       | binary type | is persistent |
+-------------+-----------------+-------------+---------------+
| STRING      | mylower(STRING) | JAVA        | false         |
 
+-------------+-----------------+-------------+---------------+


我的网名不再改
5楼 · 2020-11-21 21:55

UDF实现要点:

  • 根据集群中Hive的版本导入对应版本的hive-exec.jar

  • 自定义UDF类要继承接口UDF

  • 实现evaluate()方法

1、需要用到的依赖:


      
          org.apache.hive
          hive-exec
          1.1.0
      
1234567

2、自定义UDF类:

package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
  public String evaluate (String s) {
       if (s == null) {
          return null;
      }
        return s.toLowerCase();
  }
}12345678910

3、打成jar包上传到服务器/root/jars/ hive_udf-0.0.1-SNAPSHOT.jar
4、将jar包上传到hdfs的指定目录

hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /impala_udf/1

5、注册函数

[hadoop103:21000] > create function mylower(string) returns string location 'hdfs://impala_udf/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.impala.udf.mylower_udf';1

6、使用自定义函数

[hadoop103:21000] > select ename, mylower(ename) from emp;1

7、通过show functions查看自定义的函数

[hadoop103:21000] > show functions;
 
Query: show functions
 
+-------------+-----------------+-------------+---------------+
 
| return type | signature       | binary type | is persistent |
+-------------+-----------------+-------------+---------------+
| STRING      | mylower(STRING) | JAVA        | false         |
 
+-------------+-----------------+-------------+---------------+


乔治与佩奇
6楼 · 2021-12-20 17:12

1. 需求:统计impala 中字符串字符个数


前情:与hive  不同,impala 中的length ,char_Length 统计的是字符串中的字节个数,为了实现此需求使用自定义函数


问题关键点:正确计算,速度 


关于统计字符数正确:原本以为直接通过入参的length 就行,但是结果获得到的还是字节个数,也是很迷 (注明:impala 版本为cdh5.16中的2.12)


故写法如下:

 


package com.esen.spark;

import java.io.UnsupportedEncodingException;

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

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

public class Char_length extends UDF {

    /**

     * 如果返回值为 int时速度会更快 

     * @param regexstr

     * @return

     */

    public  IntWritable evaluate(Text regexstr) {

        if(regexstr!=null) {

            String str=null;

            try {

                str = new String(regexstr.getBytes(),"UTF-8");

            } catch (UnsupportedEncodingException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            return  new IntWritable(str.length());

        }else {

            return null;

        }

         

        //intWritable.set(str.toCharArray().length);

    }

 


在此代码中的关键点有两个: 1,利用byte 数组创建java 中utf8 字符串 2.使用匿名byte 数组   如果不使用匿名的数组,对于1.7亿数据而言,一个简单的select count(1) from a where charleng(b)>3 的时间在13分,使用匿名的函数时间则在10s


2.需求:实现与oracle 过滤方法相同的功能


oracle 过滤方法:


  FUNCTION F_CHANGE_CHR(V_NAME VARCHAR2) RETURN VARCHAR2 IS

    RESULT VARCHAR2(200);

  BEGIN

    RESULT := REGEXP_REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TO_SINGLE_BYTE(V_NAME),

                                                                                                                                                                      '(',

                                                                                                                                                                      ''),

                                                                                                                                                              ')',

                                                                                                                                                              ''),

                                                                                                                                                      '(',

                                                                                                                                                      ''),

                                                                                                                                              ')',

                                                                                                                                              ''),

                                                                                                                                      CHR(9),

                                                                                                                                      ''),

                                                                                                                              CHR(13),

                                                                                                                              ''),

                                                                                                                      '?',

                                                                                                                      ''),

                                                                                                              '?',

                                                                                                              ''),

                                                                                                      '《',

                                                                                                      ''),

                                                                                              '》',

                                                                                              ''),

                                                                                      '【',

                                                                                      ''),

                                                                              '】',

                                                                              ''),

                                                                      '—',

                                                                      ''),

                                                              '·',

                                                              ''),

                                                      ' ',

                                                      ''),

                                              '.',

                                              ''),

                                      ',',

                                      ''),

                              '<<',

                              ''),

                      '>>',

                      ''),'[[:punct:]]');

 

    RETURN RESULT;

  END;

问题难点:


在oracle 中,正则 [[:punct:]] 是过滤所有 特殊字符,但是在java 里面 \\p{Punct} 并不能达到相同效果,


impala 自定义函数最终实现:


// 实现全角转半角

 

// 写法说明: 由于impala 版本较低的原因,在evaluate 的参数 变为string,返回的结果不采用Text 进行转 //换的话,在impala 的查询结果为乱码,原因位置。但是后来我在impala 2.12 版本中并不会

public static Text evaluate(Text s) throws UnsupportedEncodingException {

if (s == null) {

return s;

} else {

Text result = new Text();

byte[] bs = s.getBytes();

String str = new String(bs, "UTF-8");

if (str.length() <= 0) {

return s;

} else {

char[] charArray = str.toCharArray();

//对全角字符转换的char数组遍历

for (int i = 0; i < charArray>

int charIntValue = (int) charArray[i];

//如果符合转换关系,将对应下标之间减掉偏移量65248;如果是空格的话,直接做转换

if (charIntValue >= 65281 && charIntValue <= 65374) {

charArray[i] = (char) (charIntValue - 65248);

} else if (charIntValue == 12288) {

charArray[i] = (char) 32;

}

}

result.set(new Text(new String(charArray)));

}

Text newchar=change_char(result);

return newchar;

}

}

// 字符过滤

    public static Text change_char(Text regexstr){

        Text returnstr=new Text();

        String targetstr=regexstr.toString();

        String target1= targetstr.

        replaceAll("[[\\pP|\\pS]&&[^―]]","").

      replaceAll("\\s*|\r|\t|\n","");

     

       returnstr.set(new Text(target1));

       return returnstr;

    }

相关问题推荐

  • 回答 10

    创建test文件夹hadoop fs -mkdir /test

  • 回答 7

    Hadoop的三大核心组件分别是:1、HDFS(Hadoop Distribute File System):hadoop的数据存储工具。2、YARN(Yet Another Resource Negotiator,另一种资源协调者):Hadoop 的资源管理器。3、Hadoop MapReduce:分布式计算框架。HDFS是一个高度容错性的系统,适合部...

  • 回答 18

    hbase依靠HDFS来存储底层数据。Hadoop分布式文件系统(HDFS)为HBase提供了高可靠性的底层存储支持,HBase中的所有数据文件都存储在Hadoop HDFS文件系统上。

  • 回答 24

    HBase分布式数据库具有如下的显著特点:容量大:HBase分布式数据库中的表可以存储成千上万的行和列组成的数据。面向列:HBase是面向列的存储和权限控制,并支持独立检索。列存储,其数据在表中是按照某列存储的,根据数据动态的增加列,并且可以单独对列进行...

  • 回答 19

    解决问题的层面不一样首先,Hadoop和Apache Spark两者都是大数据框架,但是各自存在的目的不尽相同。Hadoop实质上更多是一个分布式数据基础设施: 它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,意味着您不需要购买和维护昂贵的服务...

  • 回答 14

    1、HBase写快读慢,HBase的读取时长通常是几毫秒,而Redis的读取时长通常是几十微秒。性能相差非常大。2、HBase和Redis都支持KV类型。但是Redis支持List、Set等更丰富的类型。3、Redis支持的数据量通常受内存限制,而HBase没有这个限制,可以存储远超内存大小...

  • 回答 15

    列式存储格式是指以列为单位存储数据的数据存储格式,相比于传统的行式存储格式,它具有压缩比高、读I/O少(此处指可避免无意义的读I/O)等优点,目前被广泛应用于各种存储引擎中。对于HBase而言,它并不是一个列式存储引擎,而是列簇式存储引擎,即同一列簇中...

  • 回答 14

    一、简单理解Hadoop是一个大象:一个hadoop集群主要包含三个主要的模块:Mapreduce,hdfs,yarn。mapreduce是一个分离在合并的计算框架,注意他不是一个集群,而是一个编程框架。hdfs是一个分布式文件系统,是一个分布式集群,用于存放数据。yarn集群是负责集群...

  • 回答 12

    01 网络公开数据集02 数据报采集03 网络爬虫04 日志收集05 社会调查06 业务数据集07 埋点采集08 传感器采集09 数据交易平台10 个人数据收集

  • 回答 9

    1 Hadoop 各个目录的解释bin:Hadoop管理脚本和使用脚本所在目录, sbin目录下的脚本都是使用此目录下的脚本实现的。etc:Hadoop的所有配置文件所在的目录,所有hadoop的配置在etc/hadoop目录下include:对外提供的库的头文件lib :对外提供的动态编程库和静态...

  • 回答 4

    HDFS存储机制,包括HDFS的写入过程和读取过程两个部分: 1、写入过程:  1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。2)namenode返回是否可以上传。3)客户端请求第一个 block上传到哪几个datanode服务器上。4)nam...

  • Shuffle 发生在哪里?2021-04-28 20:11
    回答 4

    adoop核心:MapReduce原理。 MR的核心是shuffle,被称为奇迹发生的地方。 shuffle,弄乱,洗牌的意思。partition 分区,sort 排序,spill溢出,disk 磁盘下面是官方对shuffle的配图: phase 阶段,fetch 最终,merge 合并...

  • 回答 2

    Shuffle阶段分为两部分:Map端和Reduce端。一 map端shuffle过程;1-内存预排序:默认每个map有100M内存进行预排序(为了效率),超过阈值,会把内容写到磁盘;    此过程使用快速排序算法;2-根据key和reducer的数量进行分区和排序;首先根据数据所属的Parti...

  • 回答 3

    大数据时代需要1存储大量数据2快速的处理大量数据3从大量数据中进行分析 

  • Hadoop有哪几种模式?2021-04-27 20:20
    回答 3

    hadoop的四种模式。1、本地模式:本地模式就是解压源码包,不需要做任何的配置。通常用于开发调试,或者感受hadoop。2、伪分布模式:在学习当中一般都是使用这种模式,伪分布模式就是在一台机器的多个进程运行多个模块。虽然每一个模块都有相应的进程,但是却...

  • 回答 1

    进入和退出安全模式 [root@localhost bin]# ./hdfs dfsadmin -safemode enter15/08/03 07:26:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where ......

没有解决我的问题,去提问