从CSV转换为JSON时Apache NiFi ConvertRecord重命名字段

时间:2019-01-26 20:46:57

标签: apache apache-nifi dataflow

我在CSV文件中收到以下示例数据:

options = {
    baseUrl : serviceURL
  }

到目前为止,我想到的处理器流程是:

  1. GetFile
  2. UpdateAttribute 以设置具有模式文本的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 属性
  3. PutMongoRecord 使用avro.schema将记录加载到数据库中

Avro模式的外观如何?这是我最好的猜测(基于我关心的两个领域):

CSVReader

在上面指定{ "type" : "record", "namespace" : "TheNameSpace", "name" : "MySchema", "fields" : [ { "name" : "Identifier Key" , "type" : ["string"]} { "name" : "Name" , "type" : ["string", "null"]} ] } 会导致错误,因为其中包含空格。但是,其他字段,例如"Identifier Key"加载正常。

我面临的一些挑战:

  • 如何重命名字段?这是否需要在"Name"处理器和模式生态系统之外的另一个处理器块中完成?这似乎是一种常见情况,因为您希望字段的名称来自许多不同的来源。
  • Avro不喜欢在其中包含空格的字段名称(因此从ConvertRecord开始将是一个问题)。
  • 似乎没有一种在读写操作期间重命名字段的方法。我认为别名功能会有所帮助(例如:从"Identifier Key" -> "_id"开始)
  • 在导入到MongoDB之前,将单个字段(即标识符密钥)全部小写吗?

我还尝试使用"Name" -> "fullName"处理器块首先将CSV转换为JSON,以便可以将其作为JSON导入MongoDB。它需要看起来像这样(标识符键字段全部小写),但是在ConvertRecord运行后,标识符键的字段显示为null

ConvertRecord

2 个答案:

答案 0 :(得分:0)

关于什么avro我鼓励您阅读avro specs并不是一个大文件,并且将解释如何使用Avro。 关于您的问题:

  1. 如何重命名字段?您可以使用Jolt transform processor
  2. Avro不喜欢其中包含空格的字段名称:
    您至少有3种选择:
    • 忽略标题字段,因此将使用架构字段名称,请注意,您需要删除标题行,并且字段的顺序必须相同。
    • 使用震动。
    • 在使用模式之前更改名称,您可以创建自己的处理器!

您的其他问题与简历具有相同的答案,如果您是我,请创建不带空格的Schema字段名称,然后将其更改为:

  1. 从标题like here中删除空白,这样字段名称将抱怨Avro规范(如果它不是以数字开头)。
  2. 使用Jolt将字段名称转换为数据库名称。
  3. 将数据放入数据库。

希望有帮助。

答案 1 :(得分:0)

禁用名称验证,我们需要定义 avro模式注册表,Jira NiFI-4612,以解决此问题。

  • 验证字段名称

    false

一旦您在AvroSchemaRegistry定义avro模式,我们就可以在avro模式中使用空格。


要更改字段名称,请使用具有 Record Reader / Writer(具有新别名)控制器服务的 QueryRecord 处理器。

QueryRecord处理器中将新属性添加为

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

QueryRecord 处理器的输出将以_id,Name,Address作为新字段名称。