1. 安装cmake
1.1 下载
下载链接:
https://cmake.org/download/
选择已编译好的版本进行安装
1.2 安装
上传安装包到服务器并解压
配置环境变量
export PATH=/home/xxx/cmake-3.21.3-linux-x86_64/bin:$PATH
1.3 验证
验证是否安装成功
[root@xxxx xxxx]
cmake version 3.21.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
2. 安装gcc-g++
2.1 下载
下载地址:
https://pkgs.org/
2.2 安装
上传安装包到服务器并解压
执行安装
rpm -ivh gcc-c++-4.8.5-44.el7.x86_64.rpm
安装过程可能会要求其他依赖,可下载后安装再继续
2.3 验证
g++ -v
3. 安装boost库
3.1 下载
下载链接:
http://www.boost.org/
3.2 安装
上传文件到服务器并解压
执行脚本
./bootstrap.sh
脚本执行完成后,多出脚本文件b2,执行该脚本文件
./b2 install [--prefix=/home/xxx/boost/]
4. 编译开发包
4.1 下载impala-udf-devel开发包
下载地址:
https://github.com/laserson/impala-udf-devel
4.2 编译
上传服务器并进入文件进行编译
cd impala-udf-devel-master
cmake .
ERROR:
CMake Error at CMakeLists.txt:46 (add_library): Cannot find source file:
my-udf-file-1.cc
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc
CMake Error at CMakeLists.txt:46 (add_library): No SOURCES given to target: myudf
FIX:
这个需要修改为自己实现的源文件,即下图中标出的位置
5. 编写源文件
5.1 位置
在impala-udf-devel-master 目录下
5.2 头文件
#ifndef FUNCTION_H
#define FUNCTION_H
#include "udf/udf.h"
#include <string>
using namespace impala_udf;
StringVal function(FunctionContext* context, const StringVal& value);
#endif
5.3 源文件
#include "function.h"
StringVal function(FunctionContext* context, const StringVal& value)
{
……
}
5.4 参考链接
参考链接:
https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/impala_udf.html
https://github.com/cloudera/impala-udf-samples
6. 生成链接库
完成步骤5后,即可继续步骤4,继续编译,生成动态链接库
cmake .
make
编译完成后,生成build 文件夹,里面包含动态链接库
7. 上传库
7.1 上传HDFS
hdfs dfs -put libfunction.so /user/xxx/udf/
上传的路径要求为绝对路径,不然会报错:
ERROR: AnalysisException: URI path must be absolute: tmp/xxx/libfunction.so
7.2 生成函数
create function function(string) returns string location '/user/xxx/udf/libfunction.so' symbol='function';
创建成功:
±---------------------------+ | summary | ±---------------------------+ | Function has been created. | ±---------------------------+
8. 测试
成功
|