# 编写UDF函数代码并导出Jar包
#### 步骤1：编写UDF函数代码
UDF函数实现，主要注意以下几点：
- 自定义UDF需要继承UDFHandler。
- 在方法上添加@TypeResolve注解，用于表明函数的入参和出参。
  入参和出参通过"-\>"分隔。入参和出参类型（resolveType）以及对应的SQL和Java数据类型请参考[表1]。
   表1resolveType类型 
  | SQL type                            | Java type           | resolveType         |
  |:---|:---|:---|
  | BooleanType                         | Boolean.class       | BOOLEAN             |
  | ByteType                            | Byte.class          | BYTE                |
  | ShortType                           | Short.class         | SHORT               |
  | IntegerType                         | Integer.class       | INT                 |
  | LongType                            | Long.class          | LONG                |
  | FloatType                           | Float.class         | FLOAT               |
  | DoubleType                          | Double.class        | DOUBLE              |
  | StringType                          | String.class        | STRING              |
  | BinaryType                          | byte\[\].class      | BINARY              |
  | DecimalType.Fixed(precision, scale) | BigDecimal.class    | Decimal             |
  | DateType                            | LocalDate.class     | DATE                |
  | TimestampType                       | ZonedDateTime.class | TIMESTAMP           |
  | TimestampNTZType                    | LocalDateTime.class | TIMESTAMP_NTZ       |
  | YearMonthIntervalType               | Period.class        | INTERVAL_YEAR_MONTH |
  | DayTimeIntervalType                 | Duration.class      | INTERVAL_DAY_TIME   |
  | List                                | List.class          | LIST                |
  | Map                                 | Map.class           | MAP                 |
  | Struct                              | Map.class           | STRUCT              |
     
  
- 添加@deterministic注解： 表明函数是确定性的，即在给定相同的输入时，总是返回相同的结果。
  详细UDF函数实现，可以参考如下样例代码：
  - 功能描述：实现两个Integer类型整数的加法运算，并返回计算结果
  
  - 示例代码：
    ```
    package com.huawei.demo;
    import com.huawei.spark.function.types.FunctionType;
    import com.huawei.spark.function.types.TypeResolve;
    import com.huawei.spark.function.handlers.UDFHandler;
    @FunctionType(deterministic = true)
    public class UDFDemo extends UDFHandler {
        @FunctionType(deterministic = false)
        @TypeResolve("INT, INT->INT")
        public Integer testIntegerTypeAdd(Integer col1, Integer col2) {
            return col1 + col2;
        }
    }
    ```
    
  
  - 参数说明： col1：第一个整型参数（Integer对象类型）
    col2：第二个整型参数（Integer对象类型）
    
  
  
  
  - 返回值：返回col1与col2的算术和
   
 
#### 步骤2：导出Jar包
编写调试完成代码后，通过IntelliJ IDEA工具编译代码并导出Jar包。
1. 单击"Build"，参考下图分别单击"Build Project "、"Build Artifacts..."分别对代码进行编译和打包。
   图1编译和打包   
   ![](https://support.huaweicloud.com/devg-aidatalake/zh-cn_image_0000002701306783.png "点击放大") 

2. 在弹出的对话框中单击Build。
   图2编译和打包   
   ![](https://support.huaweicloud.com/devg-aidatalake/zh-cn_image_0000002671426984.png "点击放大") 

3. 完成上述步骤之后，可以在项目目录当中看到out文件夹，展开out目录。 其中的MyRemoteUDF.jar就是之后要上传到函数工作流FunctionGraph当中的jar包。
   图3查看MyRemoteUDF.jar   
   ![](https://support.huaweicloud.com/devg-aidatalake/zh-cn_image_0000002671267138.png) 
4. 右键单击MyRemoteUDF.jar，选择Copy Path/Reference，直接复制文件所在目录，方便之后上传JAR包使用。 本示例将会生成到："D:\\UDFTest\\MyRemoteUDF\\out\\artifacts\\MyRemoteUDF_jar\\"目录下，文件名为"MyRemoteUDF.jar"。
   图4复制文件所在目录   
   ![](https://support.huaweicloud.com/devg-aidatalake/zh-cn_image_0000002671426986.png "点击放大") 
 
