NiFi - Новый атрибут для создания нового с предыдущим атрибутом + закодированный текст - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь добавить новый «attributeX» для создания URL-адреса (с помощью UpdateAttribute). Этот URL будет выглядеть так: Часть 1: жестко закодированное значение (например: «www.google.com/») Часть 2: оценка атрибута 1; если пусто, используйте атрибут 2: если нет, используйте атрибут 1. Часть 3: жестко закодированное значение (например: "/ tests /") Часть 4: attribute3

Атрибуты 1,2 и 3 присутствуют в потоке файл от предыдущих процессоров. Итак, моя цель - получить такой URL: www.google.com/attribute1 ИЛИ attribute2 / tests / attribute3

НО; для этого «attributeX» требуется условие: если attribute3 пусто, мне нужно установить значение как «empty»: если НЕ пусто, мне нужно создать этот URL.

Я пытался использовать регулярное выражение, но не смог не сделаю это. Мои оценки isEmpty и ifElse терпят неудачу, когда я пытаюсь установить ifElse с жестко закодированными значениями + атрибутами.

Любая помощь приветствуется, заранее спасибо!

РЕДАКТИРОВАТЬ: я не указал ни одного из своих тестов, потому что я сделал много попыток и не смог получить ожидаемый атрибут. Я пытаюсь сделать что-то вроде этого:

${attributeA:isEmpty():ifElse(${literal("")},hardcodedText+${attributeB}+${attributeA})}

Выражение работает нормально до тех пор, пока не появится аргумент после запятой; если я использую только 1 атрибут / переменную, все работает нормально; но если я попробую использовать более одного атрибута, это не распознается как допустимое выражение.

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Пока все атрибуты компонента определены до этого выражения (т.е. заполнены в более раннем компоненте или пусто в порядке), вы можете использовать такое выражение:

${attributeA:isEmpty():ifElse(${literal("")},${literal("hardcodedText"):append(${attributeB}):append(${attributeA})})}

Проблемы с оператором, который вы пробовали (предлагается для изучения, а не для критики того, что вы пробовали):

  • attributeA:isEmpty():ifElse(${literal(""),...} имеет вторичное предложение, которое использует необработанную строку конкатенация, которая не поддерживается Apache языком выражений NiFi. Здесь вам нужно использовать функцию append() или интерполяцию строк вне предложения (например, если attributeA = x и attributeB = y, ${attributeA}_${attributeB} -> x_y).
  • Когда несколько «предложений» объединены, каждому нужен синтаксис языка выражений ${} для обозначения предложения, чтобы его можно было интерпретировать. В противном случае он может быть зарегистрирован как неизвестный «токен». Итак, в приведенном выше случае у вас есть несколько уровней предложений EL (в псевдокоде для краткости):
if (attributeA is empty) { (1)
    use "" (2)
} else {
    use "hardcodedText" + attributeB + attributeA (3)
}

В выражении 3 необходимы дополнительные предложения EL.

Если бы все элементы, которые вы объединяли, были атрибутами, вы также могли бы использовать конструкцию ${allAttributes(attributeA, attributeB, ...):join("")}.

0 голосов
/ 31 мая 2020

@ NahuelGonzalez Вы должны поделиться своим прогрессом в языке выражения, чтобы мы могли видеть, что вы делаете. Должна быть возможность выполнять все if / else logi c в одной строке языка выражений NiFi. Иногда проблема может заключаться в простом (,: или 'отсутствует или неуместно.

Однако я, возможно, сделал бы это по-другому. Создайте свои различные комбинированные атрибуты в восходящем направлении от isEmpty logi c. Затем вы Вы можете использовать указанные c URL-адреса, которые вам нужны в ответе функции.

Вы также можете использовать RouteOnAttribute для разделения потока на разные updateAttributes, которые создают разные URL-адреса. Затем объедините поток для всех URL-адресов.

...