

# 使用 UDF 查询语法进行查询
<a name="udf-query-syntax"></a>

`USING EXTERNAL FUNCTION` 子句指定可由查询中的后续 `SELECT` 语句引用的 UDF 或多个 UDF。您需要 UDF 的方法名称和托管 UDF 的 Lambda 函数的名称。您可以使用 Lambda ARN 代替 Lambda 函数名称。在跨账户场景中，需要提供 Lambda ARN。

## 摘要
<a name="udf-synopsis"></a>

```
USING EXTERNAL FUNCTION UDF_name(variable1 data_type[, variable2 data_type][,...])
RETURNS data_type
LAMBDA 'lambda_function_name_or_ARN'
[, EXTERNAL FUNCTION UDF_name2(variable1 data_type[, variable2 data_type][,...]) 
RETURNS data_type 
LAMBDA 'lambda_function_name_or_ARN'[,...]]
SELECT  [...] UDF_name(expression) [, UDF_name2(expression)] [...]
```

## 参数
<a name="udf-parameters"></a>

**USING EXTERNAL FUNCTION *UDF\$1name*(*variable1**data\$1type*[, *variable2**data\$1type*][,...])**  
*UDF\$1name* 指定 UDF 的名称，该名称必须与引用的 Lambda 函数中的 Java 方法对应。每个 *variable data\$1type* 指定一个命名变量，且其相应的数据类型应可为 UDF 接受作为输入。*data\$1type* 必须是下表中列出的受支持 Athena 数据类型之一，并映射到相应的 Java 数据类型。      
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/athena/latest/ug/udf-query-syntax.html)

**RETURNS *data\$1type***  
`data_type` 指定 UDF 作为输出返回的 SQL 数据类型。上表中列出的 Athena 数据类型均受支持。对于 `DECIMAL` 数据类型，请使用语法 `RETURNS DECIMAL(precision, scale)`，其中 *precision*（精度）和 *scale*（小数位数）是整数。

**LAMBDA '*lambda\$1function*'**  
*lambda\$1function* 指定运行 UDF 时要调用的 Lambda 函数的名称。

**SELECT [...]*UDF\$1name*(*expression*) [...]**  
`SELECT` 查询会将值传递给 UDF 并返回结果。*UDF\$1name* 指定要使用的 UDF，后跟一个*表达式*，该表达式将进行估算以传递值。传递和返回的值必须与 `USING EXTERNAL FUNCTION` 子句中为 UDF 指定的相应数据类型匹配。

### 示例
<a name="udf-examples"></a>

如需获取 GitHub 上基于[AthenaUDFHandler.java](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-udfs/src/main/java/com/amazonaws/athena/connectors/udfs/AthenaUDFHandler.java) 代码的示例查询，请参阅 GitHub 的 [Amazon Athena UDF connector](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-udfs)（Amazon Athena UDF 连接器）页面。