Процессор QueryRecord для выполнения функции агрегирования SQL в NiFi - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующий поток:

QueryDatabaseTable -> QueryRecord -> UpdateAttribute-> MergeContent-> PutelasticsearchHttp

Идея состоит в том, чтобы извлечь записи из базы данных ивыполнять агрегатные функции на полях.В таблице базы данных у меня есть следующие 4 поля:

DeptId  DepartmentName  Address  ExperienNo

1    DS    San Jose      4

2    GT    San Fran      6

3    At    Oakland       8

4    BMS   detroit       3

5    RT    Haawai        9

, и я установил службы контроллера для QueryREcord в качестве Avroreader и CSVSetWritter со следующими в качестве схемы:

{
"type": "record",
"name": "SQLSchema",
"fields" : [
{"name": "DeptId", "type": "int"},
{"name": "DepartmentName", "type": "string"},
{"name": "Address", "type": "string"},
{"name": "ExperienceNo", "type": "int"},
{"name": "Total_Experience", "type": "int"}
]
}

Я хочу выполнитьразница в двух полях (DeptId-ExperienceNo)

Мой SQL-запрос выглядит следующим образом:

SELECT DeptId, DepartmentName,Address,ExperienceNo,
(DeptId - ExperienceNo) AS Total_Experience FROM flowfile

Я получаю error as 'Total_Experience' cannot be null.

Однако тот же запрос отлично работает в MySQL.Как это может быть достигнуто, когда я могу выполнять агрегатную функцию SQL для полей и псевдонимов в виде нового динамического столбца.

Спасибо.

Любое предложение очень ценится.

1 Ответ

0 голосов
/ 18 октября 2018

Ваш csv reader Служба контроллера сконфигурирована с полем

{"name": "Total_Experience", "type": "int"} без значения по умолчанию и во входных данных вы не получаете это поле.

Таким образом, процессор жалуется Total_Experience не может быть null.

Чтобы устранить эту проблему, измените схему avro , чтобы включить null значение для Total_Experience поле.

Avro Схема:

{
"type": "record",
"name": "SQLSchema",
"fields" : [
{"name": "DeptId", "type": "int"},
{"name": "DepartmentName", "type": "string"},
{"name": "Address", "type": "string"},
{"name": "ExperienceNo", "type": "int"},
{"name": "Total_Experience", "type": ["null","int"]}
]
}

CsvReader Controller serviceКонфиги:

enter image description here

Выход:

DeptId,DepartmentName,Address,ExperienceNo,Total_Experience
1,DS,San Jose,4,-3
2,GT,San Fran,6,-4
3,At,Oakland,8,-5
4,BMS,detroit,3,1
5,RT,Haawai,9,-4

Правильный способ выполненияэто может быть:

Настройка CSV Reader без Total_Experience и включение Total_Experience в CsvSetWriter службы контроллеракогда вы создаете это поле using Query record процессором.

...