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

Posted

技术标签:

【中文标题】从 CSV 转换为 JSON 时 Apache NiFi ConvertRecord 重命名字段【英文标题】:Apache NiFi ConvertRecord Rename Fields While Converting from CSV to JSON 【发布时间】:2019-06-20 07:26:52 【问题描述】:

我在 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

目前我想出的处理器流程是:

    获取文件 UpdateAttribute 使用架构文本设置 avro.schema 属性 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,以便可以将其作为 JSON 导入 MongoDB。它需要看起来像这样(标识符键字段全部小写),但在ConvertRecord 运行后,标识符键的字段出现null

"_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"

【问题讨论】:

所以看起来我肯定需要一种方法来重命名字段,使它们不包含空格(为了 Avro 友好并重命名为数据导入的正确字段名称。 【参考方案1】:

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

    如何重命名字段?你可以使用Jolt transform processor。 Avro 不喜欢包含空格的字段名称: 您至少有 3 个选项: 忽略标题字段,因此将使用架构字段名称,注意您需要删除标题行并且字段必须以相同的顺序出现。 使用 Jolt。 在使用架构之前更改名称,您可以创建自己的处理器!

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

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

希望对你有帮助。

【讨论】:

【参考方案2】:

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

验证字段名称

false

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


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

在QueryRecord处理器中添加新属性

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

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

【讨论】:

以上是关于从 CSV 转换为 JSON 时 Apache NiFi ConvertRecord 重命名字段的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试写入文件时,将 JSON 转换为 XML 错误

Node JS:从 JSON 到 CSV 的转换

使用 PHP 将 CSV 转换为 JSON

如何将 CSV 文件转换为多行 JSON?

对于使用apache POI转换为CSV时的xlsx单元格数据

在 Python 中将嵌套的 JSON 转换为 CSV 文件