Apache NiFi ConvertRecord переименовывает поля при преобразовании из CSV в JSON - PullRequest
0 голосов
/ 26 января 2019

В CSV-файл поступают следующие образцы данных:

Identifer Key,Name,Address,City,State,ZIP  
WELD-424,Jane Doe,123 Main St,Whereverville,CA,90210  
MOWN-175,John Doe,555 Broadway Ave,New York,NY,10010

Поток процессора, который я придумал, таков:

  1. GetFile
  2. UpdateAttribute для установки свойства avro.schema с текстом схемы
  3. PutMongoRecord использует CSVReader для загрузки записей в базу данных

Как будет выглядеть схема Avro для этого? Вот мое лучшее предположение (основываясь на двух областях, которые меня интересуют):

{
   "type" : "record",
   "namespace" : "TheNameSpace",
   "name" : "MySchema",
   "fields" : [
     { "name" : "Identifier Key" , "type" : ["string"]}
     { "name" : "Name" , "type" : ["string", "null"]}
   ]
}

Указание "Identifier Key" выше дает ошибку, поскольку содержит пробел. Другие поля, такие как "Name" нормально загружаются, однако.

Некоторые проблемы, с которыми я сталкиваюсь:

  • Как вы переименовываете поля? Нужно ли это делать в другом процессорном блоке вне экосистемы ConvertRecord и схемы? Это похоже на обычный сценарий, потому что вы хотите, чтобы поля имели одинаковые имена из разных источников.
  • Avro не нравится имена полей с пробелами в них (поэтому переход с "Identifier Key" -> "_id" будет проблематичным).
  • Кажется, нет способа переименовать поле во время операции чтения и записи. Я думал, что возможность псевдонимов поможет (например: переход от "Name" -> "fullName")
  • Сделать единственное поле (т. Е. Ключ идентификатора) полностью строчными перед импортом в MongoDB?

Я также попытался с помощью блока процессора ConvertRecord сначала преобразовать из CSV в JSON, чтобы его можно было импортировать в MongoDB как JSON. Это должно было бы выглядеть примерно так (с полем идентификатора ключа все строчные), но поле выходит null для Идентификатор ключа после того, как ConvertRecord выполняется:

{"_id": "weld-424", "fullName": "Jane Doe", "updated": {"$date":"2018-11-01T04:00:00.000Z"}, "created": {"$date":"2018-11-01T04:00:00.000Z"}}
{"_id": "mown-175", "fullName": "John Doe", "updated": {"$date":"2018-11-01T04:00:00.000Z"}, "created": {"$date":"2018-11-01T04:00:00.000Z"}}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

К Отключить проверку имени Схема Avro, которую мы должны определить Реестр схемы Avro , Jira NiFI-4612 для решения этой проблемы.

  • Проверка имен полей

    false

Как только вы определите авро-схему в AvroSchemaRegistry, мы сможем использоватьпробелы в схеме avro.


Чтобы изменить имя поля, используйте QueryRecord процессор с Record Reader / Writer (с новым псевдонимом) службы контроллера.

Добавить новое свойство в Процессор QueryRecord как

select "Identifer Key" _id,Name,Address from FLOWFILE

Выход Процессор QueryRecord будет иметь _id,Name,Address в качестве новых имен полей.

0 голосов
/ 28 января 2019

О том, что avro Я рекомендую вам прочитать avro specs не большой документ и объясню, как использовать Avro.О ваших вопросах:

  1. Как вы переименовываете поля?вы можете использовать процессор преобразования Джолта .
  2. Avro не нравится имена полей с пробелами в них:
    у вас есть как минимум 3 варианта:
    • Игнорировать заголовокполя, поэтому будут использоваться имена полей схемы, обратите внимание, что вам нужно удалить строку заголовка, и поля должны быть в том же порядке.
    • Использовать толчок.
    • Измените имена перед использованиемсхема, вы можете создавать свои собственные процессоры!

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

  1. Удалите пустые пробелы из заголовка, как здесь , таким образом, имена полей будут жаловаться на спецификацию Avro (если она не начинается с цифр).
  2. Используйте Jolt для преобразования имен полей в имена баз данных.
  3. Поместите ваши данные в базу данных.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...