StarRocks Предоставляет множество функций для облегчения ежедневного запроса и анализа данных. В дополнение к общепринятым классификациям функций, StarRocks Также поддерживает ARRAY、JSON、MAP、STRUCT и другие полуструктурированные функции, поддерживаемые Лямбда-функции высшего порядка。Если ни одна из вышеперечисленных функций вам не подходитизнуждаться,Вы также можете написать Java UDF для удовлетворения потребностей бизнеса. Стар Рокс Также доступен Hive Bitmap UDF функция, вы можете Hive Рассчитать и сгенерировать Bitmap После этого импортируйте Стар Рокс будет; StarRocks созданный в Растровое изображение, экспорт в Улей, удобный для использования другими системами.
Spark UDF — это мощный инструмент, который позволяет разработчикам создавать собственные функции для расширения функциональности Spark SQL. Однако когда придет время перенести эти пользовательские функции в StarRocks, вы можете столкнуться с некоторыми проблемами, поскольку эти две системы архитектурно и функционально различаются.
Начиная с версии 2.2.0, StarRocks поддерживает написание пользовательских функций (UDF) на языке Java.
Начиная с версии 3.0, StarRocks поддерживает глобальную UDF. Вам нужно только добавить ключевое слово GLOBAL в соответствующий оператор SQL (CREATE/SHOW/DROP), и этот оператор вступит в силу глобально. Нет необходимости выполнять этот оператор для каждой базы данных. один за другим. Вы можете разрабатывать собственные функции на основе бизнес-сценариев, чтобы расширить функциональные возможности StarRocks.
Пользовательские функции, поддерживаемые в настоящее время StarRocks, включают пользовательскую скалярную функцию (Scalar UDF), пользовательскую функцию агрегирования (User Defined Aggregation Function, UDAF), пользовательскую оконную функцию (User Defined Window Function, UDWF), пользовательскую табличную функцию. (Пользовательская табличная функция (UDTF).
Официальная документация: https://docs.starrocks.io/zh/docs/sql-reference/sql-functions/JAVA_UDF/
StarRocks Узел FE поддерживает включение UDF, который по умолчанию отключен. На стороне клиента вы можете использовать следующую команду, чтобы проверить, включена ли она. Только если она у вас есть. cluster_admin
Рольиз Только пользователи могут выполнять команды, связанные с управлением кластером.。enable_udf
Параметры являются статическими параметрами.。
ADMIN SHOW FRONTEND CONFIG LIKE "%udf%";
Параметры FE делятся на динамические параметры и статические параметры.
Можно ли передать параметр, является ли параметр динамическим. ADMIN SHOW CONFIG вернуть результаты IsMutable
вид столбца。TRUE
Представляет динамические параметры.
Могут передаваться как статические, так и динамические параметры. fe.conf Файл модифицирован.
ссылкаFEузелиз Все конфигурации:https://docs.starrocks.io/zh/docs/administration/management/FE_configuration/
Официальная документация: https://docs.starrocks.io/zh/docs/sql-reference/sql-functions/JAVA_UDF/
В этом документе скалярная функция UDF используется только в качестве примера. Дополнительные типы функций UDF можно найти в официальной документации.
Пример функции SparkUDF. Ниже приведен класс инструмента UDF, который извлекает идентификатор из строковых скобок.
package com.tencent.sparkpad.udf
//scalastyle:off
import org.apache.spark.sql.api.java.UDF1
class ExtractIdUDF extends UDF1[String, String] {
override def call(targetStr: String): String = {
if (targetStr == null || targetStr.isEmpty) {
return "0"
}
val reg = "(?<=\\()[^\\(]*?(?=\\)$)".r
val matchList = reg.findAllMatchIn(targetStr.trim).toList
if (matchList.nonEmpty) {
return matchList.last.toString()
}
"0"
}
}
Преобразование SparkUDF в Java UDF-функция,Создайте новый обычный проект на Java.,Настроить pom.xml,Создайте новый обычный класс в пакете,,evaluate
Метод скалярный UDF Запись о вызове должна быть public Методы-члены, функции не могут быть добавлены static Ключевые слова.
package org.example;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractIdUDF {
public final String evaluate(String targetStr) {
if (targetStr == null || targetStr.isEmpty()) {
return "0";
}
String reg = "(?<=\\()[^\\(]*?(?=\\)$)";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(targetStr.trim());
String lastMatch = "0";
while (matcher.find()) {
lastMatch = matcher.group();
}
return lastMatch;
}
}
// Тестовый пример
// String testStr1 = "Example (123)";
// String testStr2 = "Another example (456)";
// String testStr3 = "No match here";
// System.out.println(call(testStr1)); // Выход: 123
// System.out.println(call(testStr2)); // Выход: 456
// System.out.println(call(testStr3)); // Выход: 0
Ссылка на отношения сопоставления типов в Java и SQL выглядит следующим образом:
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:1px solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
SQL TYPE | Java TYPE |
---|---|
BOOLEAN | java.lang.Boolean |
TINYINT | java.lang.Byte |
SMALLINT | java.lang.Short |
INT | java.lang.Integer |
BIGINT | java.lang.Long |
FLOAT | java.lang.Float |
DOUBLE | java.lang.Double |
STRING/VARCHAR | java.lang.String |
Затем упакуйте проект и создайте два пакета Jar в целевом каталоге.
mvn package
Воляtarget/xxx-1.0-SNAPSHOT-jar-with-dependencies.jar
Пакет загружен вStarRocksДоступенизфайловый сервер,Такие как nginx,Пример конфигурации nginxiz выглядит следующим образом:
server {
listen 8888 default_server;
location / {
root /data/file-server/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
}
}
Синтаксис создания функции UDF следующий:
CREATE [GLOBAL][AGGREGATE | TABLE] FUNCTION function_name(arg_type [, ...])
RETURNS return_type
[PROPERTIES ("key" = "value" [, ...]) ]
Функция UDF, используемая в примере создания для извлечения идентификатора из строки, выглядит следующим образом:
CREATE FUNCTION ExtractIdUDF(string)
RETURNS string
PROPERTIES (
"symbol" = "org.example.ExtractIdUDF",
"type" = "StarrocksJar",
"file" = "http://9.x.x.x:8888/xxx-1.0-SNAPSHOT-jar-with-dependencies.jar"
);
Имя функции ExtractIdUDF представляет тип и количество параметров, а RETURNS представляет тип возвращаемого значения.
Параметры PROPERTIES объясняются следующим образом:
Созданная по умолчанию изUDF-функция может использоваться только в текущей базе данных.,При необходимости к нему можно получить доступ из других баз данных.,Необходимо создать глобальную UDF-функцию,то есть плюсGLOBALКлючевые словаCREATE GLOBAL FUNCTION xxx ...
。
Запрашивайте функции UDF и запрашивайте глобальные функции UDF.
SHOW FUNCTIONS;
SHOW GLOBAL FUNCTIONS;
Чтобы удалить функцию UDF, вам необходимо указать имя функции и параметры. При удалении глобальной функции UDF добавьте ключевое слово GLOBAL.
DROP FUNCTION ExtractIdUDF(string)
-- DROP GLOBAL FUNCTION ExtractIdUDF(string)
Вызовите пользовательскую функцию ExtractIdUDF, и значение возвращаемого поля: extractidudf('Hello(123)') равно 123.
SELECT ExtractIdUDF("Hello(123)");
Error Code: 1064. org/example/ExtractIdUDF has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 55.0
Это сообщение об ошибке указывает на то, что ваш класс UDF org.example.ExtractIdUDF был скомпилирован с использованием более поздней версии Java, чем та, которая поддерживается средой Starrocks. В ошибке упоминается, что ваша версия файла класса — 65.0, что соответствует Java 21, а ваша среда Starrocks поддерживает только версию файла класса 55.0, которая является версией до Java 11 (Java 11 и ниже). Поэтому необходимо уменьшить скомпилированную версию Java до Java11 или ниже. Рекомендуется использовать Java1.8.