Использование языка выражений NiFi
Язык выражений NiFi позволяет управлять значениями атрибутов FlowFile при настройке свойств процессоров.
Язык выражений также может применяться:
-
при использовании ссылки на переменную;
-
как значение параметра, созданного в контексте параметров.
Структура языка выражений
Язык выражений NiFi всегда начинается с начального разделителя ${
и заканчивается конечным разделителем }
.
Между начальным и конечным разделителями находится текст самого выражения. В своей простейшей форме выражение может состоять только из имени атрибута. Например, ${topic.name}
вернет значение атрибута названия топика.
Для манипуляций со значением атрибута, переменной или параметра в языке выражений используются различные функции.
Вы можете заменить часть значения атрибута, вызвав функцию replace — ${topic.name:replace('1', '2')}
. В этом случае мы обращаемся к атрибуту topic.name
, а затем меняем часть значения этого атрибута с 1
на 2
.
Когда для атрибута выполняется вызов функции, этот атрибут является субъектом, над которым работает функция. Можно комбинировать несколько вызовов функций, когда возвращаемое значение первой функции становится субъектом второй функции, а возвращаемое значение становится субъектом третьей функции и так далее. Количество функций, которые можно связать вместе, не ограничено.
На любой атрибут FlowFile можно ссылаться с помощью языка выражений. Однако, если имя атрибута содержит "специальный символ", имя атрибута необходимо экранировать, заключив его в кавычки. Следующие символы считаются "специальными символами" — $
, |
, {
, }
, (
, )
, [
, ]
, ,
, :
, ;
, /
, *
, '
, пробел, \t
, \r
, \n
.
Кроме того, число считается "специальным символом", если оно является первым символом имени атрибута. Если какой-либо из этих специальных символов присутствует в атрибуте, он заключается в одинарные или двойные кавычки.
Также существуют некоторые функции. Эти функции вызываются простым вызовом в начале выражения, например, ${hostname()}
. Попытка вызвать функцию с субъектом приведет к ошибке.
Иерархия языка выражений
При использовании языка выражений для ссылки на свойство по имени существует определенная иерархия, в которой NiFi будет искать значение.
Текущая иерархия в NiFi выглядит так:
-
Поиск FlowFile для атрибута/ключа.
-
Поиск переменных группы процессов для атрибута/ключа.
-
Поиск файла в реестре файлов для атрибута/ключа.
-
Поиск свойств JVM NiFi для атрибута/ключа.
-
Поиск переменных системной среды для атрибута/ключа.
NiFi ищет и возвращает первое вхождение соответствующего свойства. Если подходящее свойство не найдено, возвращается null
.
Pедактор языка выражений
Настройка значения свойств процессоров более удобна при использовании редактора языка выражений.
Для выражений, начинающихся с ввода ${
, редактор выделяет круглые и фигурные скобки, чтобы пользователь мог легко определить, какая открывающая скобка или фигурная скобка соответствует какой закрывающей скобке или фигурной скобке.
Редактор также предоставляет контекстно-зависимую справку, предоставляя список всех функций, которые можно использовать в текущей позиции курсора. Для активации этой функции необходимо нажать Ctrl+Space
на клавиатуре.
Пользователь также может ввести часть имени функции, а затем нажать Ctrl+Space
, чтобы увидеть все функции, которые можно использовать и которые начинаются с того же префикса. Если напечатать в редакторе ${topic:replace
и затем нажать Ctrl+Space
, появится всплывающее окно со списком функций:
-
replace
-
replaceAll
-
replaceEmpty
-
replaceFirst
-
replaceNull
Если продолжить ввод, можно сузить список отображаемых функций. Также можно выбрать одну из функций из списка, дважды нажав мышью или используя клавиши со стрелками, чтобы выделить нужную функцию, затем нажать Enter
.
Типы данных для языка выражений
Каждое значение субьекта функции, значение аргумента и значение, возвращаемое функцией, имеют определенный тип данных. Тип субьекта функции (Subject Type), тип аргументов (Arguments), если они есть, или тип значения, возвращаемого функцией (Return Type), указаны в описании каждой из функций.
Язык выражений поддерживает четыре различных типа данных:
-
String — последовательность символов, которая может состоять из цифр, букв, пробелов и специальных символов.
-
Number — целое число, состоящее из одной или нескольких цифр (от 0 до 9). При преобразовании в числа из типов данных Date они представляются как количество миллисекунд с полуночи по Гринвичу 1 января 1970 года.
-
Decimal — числовое значение, которое может поддерживать десятичные и более крупные значения с минимальной потерей точности. Точнее, это 64-битная IEEE 754 с плавающей запятой двойной точности.
-
Date — объект, который содержит дату и время. Используя функции
Date Manipulation
иType Coercion
, этот тип данных можно преобразовать в/из строк и чисел. -
Boolean — логическое значение, значение которого может быть
true
илиfalse
.
После оценки функций языка выражений все атрибуты сохраняются как тип String.
Использование языка выражений при работе с процессорами
Язык выражений широко используется в интерфейсе NiFi Server для настройки свойств процессора. Не все свойства процессора поддерживают язык выражений. Информация о том, поддерживается ли язык выражений для данного свойства процессора указана в верхней части окна для ввода значения при настройке процессора на вкладке PROPERTIES.
Также при нажатии на иконку у наименования свойства видно, какая область видимости для языка выражений поддерживается:
-
NONE — язык выражений не поддерживается для этого свойства.
-
VARIABLE_REGISTRY — язык выражений поддерживается для этого свойства на уровне переменных. При этом поиск переменной выполняется иерархически:
-
Переменные определяются на уровне группы процессов, а затем, рекурсивно, до группы процессов более высокого уровня до корневой группы процессов.
-
Переменные, определенные в файлах пользовательских свойств через свойство
nifi.variable.registry.properties
в файле nifi.properties. -
Переменные среды, определенные на уровне JVM и свойствах системы.
-
-
FLOWFILE_ATTRIBUTES — для языка выражений можно использовать атрибуты каждого отдельного файла потока, а также переменные.
Пример ссылки на переменную
Для процессора PublishKafka при настройке свойства Kafka Brokers можно использовать только переменные.
Создав переменную kafka.broker
со значением kafka-1.ru-central1.internal:9092
, этим значением можно манипулировать, установив при помощи языка выражений также значения kafka-2.ru-central1.internal:9092
, kafka-3.ru-central1.internal:9092
и т.д., как описано выше. Выражение для замены части значения переменной выглядит следующим образом:
${kafka.broker:replace('1', '2')}
ПРИМЕЧАНИЕ
Замена символов может быть использована при большом количестве брокеров Kafka c именами хостов, отличающихся несколькими символами. При создании новых процессоров, используя замену одного или нескольких символов, можно задавать значение брокеров Kafka без необходимости писать наименование брокера вручную, вносить каждый брокер Kafka в контекст параметров или в качестве переменной. |
Пример ссылки на атрибут FlowFile
Далее, настраивая следующее свойство Topic Name для процессора PublishKafka, можно увидеть, что данное свойство разрешает использовать атрибуты FlowFile.
Для данного свойства можно задать значение атрибута FlowFile filename
и к нему присоединить значение текущего времени при помощи функции now с применением функции format.
ВНИМАНИЕ
При использовании языка выражений в настройке свойств процессора PublishKafka необходимо учитывать следующее:
|
Выражение выглядит следующим образом:
${filename}_${now():format("HH.mm.ss", "GMT+3")}
Тогда, если значение атрибута filename
в данном FlowFile — datafile
, процессор PublishKafka публикует данные в топике datafile_12.26.14
, где 12.26.14
— время публикации топика в формате "HH.mm.ss", в часовом поясе "GMT+3".
ПРИМЕЧАНИЕ
Наименование файла с применением текущего времени в качестве имени топика может быть использовано при необходимости публикации в топики Kafka данных из FlowFile, созданного из часто перезаписываемого локального файла. |
Пример значения параметра в контексте параметров
Cвойство Topic Name процессора PublishKafka можно настроить через контекст параметров. Если в контексте параметров создать параметр topic
со значением ${filename}
и параметр time
со значением ${now():format("HH.mm.ss", "GMT+3")}
, можно применить созданные параметры в качестве свойства.
Выражение выглядит следующим образом:
#{topic}_#{time}
Тогда, если значение атрибута filename
в данном FlowFile — datafile
, процессор PublishKafka публикует данные в топике datafile_12.26.14
, как и в предыдущем примере.