NIFI:每月将来自SQL查询的转储作为CSV文件提取到SFTP服务器中

时间:2018-10-12 16:16:35

标签: apache-nifi

我想使用SQL查询将数据分别作为每月CSV存储到SFTP服务器中。

例如,我的查询是:

    select fooId, bar from FooBar 
where query_date>=20180101 and query_date<20180201 --(for the month of January 2018)

我想将其作为20180101_FooBar.csv存储到我的SFTP服务器上。同样,其他月份的其他文件将以相同的过程执行,但间隔为 query_date

要考虑的重要事项:I have to store the *fooId* as MD5 Hash string.

如何在NIFI中自动执行此流程?

大致上,我预见的流程是:

*ExecuteSQL*(but not sure how to paramterize the counter for query_date) 
-> *ConvertAvroToJson* 
-> *EvaluateJsonPath* (to extract the fooID ) 
-> *HashContent* 
-> *MergeContent* 
-> *PutSFTP*

请为我提出建议。

1 个答案:

答案 0 :(得分:2)

对于这种情况,我可以想到三种方法。

方法1 :使用MD5函数执行SQL查询以获取fooId的哈希值:

enter image description here

流量:

  1. GenerateFlowFile //添加开始日期,结束日期属性

    startdate -> ${now():format("yyyyMM"):minus(1):append("01")}
    enddate   -> ${now():format("yyyyMM"):append("01")}
    
  2. ExecuteSQL //选择md5(fooId)foodId,从FooBar中删除,其中

    query_date>=${startdate} and query_date<${enddate}
    

    根据您的来源更改上述查询,以获取列的md5哈希值

  3. ConvertRecord //将Avro格式转换为Json格式

  4. UpdateAttribute //更改文件名
  5. PutSFTP //存储文件。

方法2 :在NiFi中创建MD5哈希值

enter image description here

流量:

  1. GenerateFlowFile //添加开始日期,结束日期属性

    startdate -> ${now():format("yyyyMM"):minus(1):append("01")}
    enddate   -> ${now():format("yyyyMM"):append("01")}
    
  2. ExecuteSQL //选择fooId,从FooBar中删除

    其中query_date> = $ {startdate}和query_date

    根据您的来源更改以上查询,以获取列的md5哈希值

  3. ConvertRecord //将Avro格式转换为Json格式

  4. SplitJson //将json数组拆分为单独的流文件
  5. EvaluateJsonPath //将除fooId键之外的所有键值提取为流文件属性。
  6. EvaluateJsonPath //使用fooId值覆盖流文件内容
  7. HashContent //使用MD5算法获取流文件内容的哈希值
  8. AttributesToJson //使用新的哈希md5值重新创建json消息
  9. MergeContent //使用整理策略创建json数组
  10. UpdateAttribute //更改文件名
  11. PutSFTP ////存储文件。

另一种方法是编写脚本,该脚本可以解析json数组消息并为md5 hashvalue键创建fooId并使用新的md5哈希值写入json消息。

我上载了两种方法Approach1Approach2模板,保存并上传到NiFi实例以获取更多参考,并使用最适合您情况的方法。