выполнить executeSql после процессора putSql - PullRequest
0 голосов
/ 17 февраля 2019

Мой вариант использования - запросить набор данных для набора таблиц и вставить их в одну таблицу.так что мой процессор nifi в основном выглядит следующим образом:

executeSql (набор запросов из набора данных) >>> convertAvrotoJson >>>> convetJSONtoSQL (преобразовать в оператор вставки) >>>> putSQL (оператор вставки)>>> executeSQL (удалить строку, связанную с первым запросом процессора в наборе таблиц)

проблема заключается в последнем процессоре executeSQL, когда он не выполняет мой sql, вместо этого он продолжает пытаться выполнить запрос putSQL.

я заменяю свой запрос на удаление обычным выбором для проверки (это в executeSQL): enter image description here

и это данныеПроисхождение для executeSQL, мы можем ясно видеть, что он все еще пытается выполнить оператор вставки, поступающий из putSQL, даже если я уже указал просто выполнить запрос: enter image description here

, и это ошибка,ошибка ясно говорит, что я не предоставил параметр, когда я явно не хочу, чтобы он выполнял оператор вставки:

enter image description here

как выполнить оператор удаления на tВ состоянии B после того, как я успешно вставил запись в таблицу A?Пожалуйста, помогите, поскольку я застрял в этом.Пожалуйста, не путайте с изображением, так как я просто тестирую его с помощью обычного выбора, чтобы убедиться, что nifi может правильно выполнить мой запрос.я использую mysql 5.7

1 Ответ

0 голосов
/ 19 февраля 2019

Если в файле потока есть sql.args атрибуты, ExecuteSQL попытается использовать их для заполнения PreparedStatement параметрами.Это связано с тем, что указанный запрос (поступающий через тело файла потока или свойство SQL select query) может иметь параметры ?, которые должны заполняться атрибутами файла потока.Для вышеописанного потока вы можете поместить процессор UpdateAttribute между PutSQL и ExecuteSQL, установив для свойства Delete Attributes Expression значение sql\.args\..* или что-то еще, чтобы удалить параметры.

Сказав это, я рекомендую вам заменитьвесь поток с ExecuteSQL -> PutDatabaseRecord -> ExecuteSQL.Это обходит логику преобразования, и генерация / выполнение SQL выполняется внутри (поэтому нет необходимости в атрибутах sql.args).

...