【问题标题】:Naming convention in NiFiNiFi中的命名约定
【发布时间】:2018-11-02 22:34:39
【问题描述】:

我有一个流程GetFile->ConvertRecord->splittext->PutdatabaseRecord。我发送到 GetFile 的 csv 文件包含以下字段:

ID  TIME                      M00B01  M00B02  M00B03
1   2018-09-27 10:44:23.972   3242    35      335
2   2018-09-21 11:44:23.972   323     24      978

MYSQL中MY数据库表骨架如下:

Create table test(ID INT,TIME DATETIME(3),MxB01 INT,MxB02 INT,MxB03 INT);

注意:我已将标题名称替换为 MxB00、MxB01 等。

当我以 CSVReader 读取并以 CSVSetWritter 写入时,我的 convertRecord 处理器出现错误。我附上两者的配置供您参考。

问题是它读取 CSV 文件,但由于标题名称的更改,它使所有其他字段为空白(我更改了标题名称,因为我必须将标题名称写为 MxB00 以匹配 MySQL 中定义的标题桌子)。我得到了 ID 和 Time 的值,因为我没有更改 CSVWritter 和 MySQL 表定义中这些字段的标题名称。所以我得到的那些值,但对于其他值,我得到空白,因为它由于名称更改而变得混乱。

我该如何解决这个问题?非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: mysql apache etl apache-nifi


    【解决方案1】:

    如您想为输出 CSV 文件创建自定义标头,然后配置 CSV 阅读器 控制器服务,如下所示。

    配置:

    因为我们使用架构访问策略作为架构文本并将架构作为

    {
    "type": "record",
    "name": "SQLSchema",
    "fields" : [
    {"name": "ID", "type": ["null","int"]},
    {"name": "TIME", "type": ["null","string"]},
    {"name": "MxB01", "type": ["null","int"]},
    {"name": "MxB02", "type": ["null","int"]},
    {"name": "MxB03", "type": ["null","int"]}
    ]
    }
    

    我们将第一行 csv 数据视为 Header忽略 CSV 标题列名,因此输出流文件将具有我们在上面定义的架构。 p>

    CsvWriter 配置:

    由于我们继承了模式写入策略,因此输出流文件将具有我们在阅读器中指定的相同标题。

    另外我不知道你为什么在 ConvertRecord 之后使用 SplitText 处理器作为 PutDatabaseRecord 处理器,旨在一次处理大量记录。

    即使您可以使用上述 CsvReader 控制器服务配置 PutDatabaseRecord 处理器,那么您的流程将是:

    流程:

    GetFile -> PutDatabaseRecord
    

    注意:

    如果您使用逻辑类型,我没有将 Avro 逻辑类型用于时间戳字段,因此请相应地更改控制器服务配置。

    【讨论】:

    • 感谢您的回复。我正在使用 {"name":"TimeOfDay","type":"string","logicalType":"timestamp-millis"} 作为我的逻辑类型,但我在转换记录中遇到错误“将路由失败:对于输入字符串“2018-09-27 10:44:23.971”。我已将 CSVReader 和 writer 设置设置为与您描述的相同。请帮助
    • 另外,在 MxB00、MxB01 等字段中,我得到的都是 0 值,而不是 CSV 文件中存在的实际值。 @舒
    • @shrads,使用 avro 逻辑类型 有点棘手,我尝试了上面的示例并在此链接中添加了模板:github.com/shureddy/NiFiTemplates/blob/master/….. 下载并上传模板到您的 nifi 实例并根据您的用例进行相应更改。
    【解决方案2】:

    尝试 GetFile->ReplaceText-->ConvertRecord->splittext->PutdatabaseRecord。

    配置:

    搜索值:输入标题, 替换值:新标题, 替换策略:字面替换, 评价模式;全文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多