Apache nifi 从平面文件读取数据后,如何仅从Nifi流文件中提取少数列
平面文件包含以下数据,但没有需要加载到MySQL表中的头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中吗?这只是一种方法,但还有其他几种方法。此方法使用记录,并避免修改基础数据-它只是
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" }
]
}
我成功地运行了这个。谢谢你们的意见,伙计们