Apache nifi 从平面文件读取数据后,如何仅从Nifi流文件中提取少数列

Apache nifi 从平面文件读取数据后,如何仅从Nifi流文件中提取少数列,apache-nifi,Apache Nifi,平面文件包含以下数据,但没有需要加载到MySQL表中的头 101,AAA,1000,10 102,BBB,5000,20 我使用GetFile或GetSFTP处理器读取数据。读取数据后,流文件将包含上述数据。我只想将第1列、第2列和第4列加载到MySQL表中。我希望MySQL表中的输出如下所示 101,AAA,10 102,BBB,20 你能帮助我如何从nifi中的传入流文件中只提取几列并将其加载到MySQL中吗?这只是一种方法,但还有其他几种方法。此方法使用记录,并避免修改基础数据-它只是

平面文件包含以下数据,但没有需要加载到MySQL表中的头

101,AAA,1000,10
102,BBB,5000,20
我使用GetFile或GetSFTP处理器读取数据。读取数据后,流文件将包含上述数据。我只想将第1列、第2列和第4列加载到MySQL表中。我希望MySQL表中的输出如下所示

101,AAA,10
102,BBB,20

你能帮助我如何从nifi中的传入流文件中只提取几列并将其加载到MySQL中吗?

这只是一种方法,但还有其他几种方法。此方法使用记录,并避免修改基础数据-它只是忽略在插入过程中不需要的字段。这在与更大的流集成时是有益的,其中数据由其他可能需要原始数据的处理器使用,或者您已经在使用记录

假设您的表具有列

id | name | value
你的数据看起来像

101,AAA,1000,10
102,BBB,5000,20
您可以使用
PutDatabaseRecord
处理器,将
字段行为不匹配
列行为不匹配
设置为
忽略不匹配…
,并添加
CSVReader
作为
记录读取器

CSVReader
中,您可以将
架构访问策略设置为
使用“架构文本”属性
。然后将
Schema Text
属性设置为以下值:

{
     "type": "record",
     "namespace": "nifi",
     "name": "db",
     "fields": [
       { "name": "id", "type": "string" },
       { "name": "name", "type": "string" },
       { "name": "ignoredField", "type": "string" },
       { "name": "value", "type": "string" }
     ]
} 
这将根据DB表列匹配NiFi记录字段,DB表列将匹配字段1、2和4,而忽略字段3(因为它与列名不匹配)

显然,请修改
模式文本中的字段名
模式,以匹配DB表的列名。您还可以在此处执行数据类型检查/转换


另一种方法是在的帮助下,使用将流文件转换为记录。 它有助于将CSV格式转换为您喜欢的任何格式,您仍然可以保留CSV格式

但是,随着流文件成为记录,您现在可以使用以下附加处理器: ,因此您可以在流文件上运行类似SQL的命令:

“从流文件中选择*”

在您的情况下,您可以:

从流文件中选择col1、col2、col3

您还可以直接应用筛选:

从col1>500的流文件中选择col1、col2、col3

我建议你阅读以下内容:


    • 非常感谢pdeuxa和Sdairs的回复。你的意见很有帮助。我试着用和你们两个相似的方法。我使用了
      convertRecord
      并配置了
      CSVRecordReader
      CSVSetRecordWriter
      CSVRecordReader
      具有以下模式来读取数据

      {
           "type": "record",
           "namespace": "nifi",
           "name": "db",
           "fields": [
             { "name": "id", "type": "string" },
             { "name": "name", "type": "string" },
             { "name": "Salary", "type": "string" },
             { "name": "dept", "type": "string" }
           ]
      } 
      
      CSVSetRecordWriter
      具有以下输出模式。输入模式中有4个字段,而输出模式只有3列

      {
           "type": "record",
           "namespace": "nifi",
           "name": "db",
           "fields": [
             { "name": "id", "type": "string" },
             { "name": "name", "type": "string" },
             { "name": "dept", "type": "string" }
           ]
      } 
      
      我成功地运行了这个。谢谢你们的意见,伙计们