各位技术人员-- 我正在尝试确定每小时通过 https://vpic.nhtsa.dot.gov/api/ 移动数千个 VIN# 的最佳方法。解析出与每个相关的特征数组。我有两种方法选择,DecodeVINValuesBatch 和 DecodeVIN。批处理版本允许数组,DecodeVIN 是单个引用。在 .NET/C# 或 JBOSS + DBMS 环境中,我知道我会通过首先调用 DecodeVINValuesBatch 来解决该问题,然后在处理过程中捕获 vPIC 集合中的每个值 Id,同时写出数据集。我预计 NiFi 中的集合论不会有任何不同——但我不熟悉这个工具——并且没有遇到任何代表解决通过连续输入流处理多个集合的示例。我对此的想法是,我将从 InvokeHTTP 处理器开始,它捕获 VIN# + 多个其他数据片段,同时将数据的多个部分拆分到不同的处理器中。其中一个处理器需要将 VIN# 与另一个 InvokeHTTP 处理器隔离,以便对 NHTSA 进行外部调用。一方面,在这种情况下,单个 DecodeVIN 似乎是更好的选择。另一方面,我想知道如何最好地管理这些数据。我是否应该考虑丢失的数据、重复的数据等——因此准备好成组处理?我正在寻找生产质量 NiFi 实现的指导和最佳实践。有什么建议吗?
最佳答案
我无法解析您链接到的 API,但以下是执行此类行为的一般模式。
您说得对,InvokeHTTP
处理器是从远程 HTTP 端点检索数据的最佳候选者。生成的流文件内容将包含来自 HTTP 调用的响应,例如,假设该响应采用 JSON 格式。如果我对您对可用 API 方法的描述的理解是正确的,您有两个选择:
DecodeVIN
接受单个 VIN 值并返回特定 VIN 的一些数据集DecodeVINValuesBatch
接受 VIN 值数组并返回与提供的 VIN 对应的数据集数组
如果您试图实现每小时“数千”个 VIN 的吞吐量,我几乎肯定会推荐第二种选择。它将大大减少网络开销(数量级)并减少分割记录的无关处理。
为了将数据的传入格式转换为该批处理方法可接受的参数,您应该检查 ConvertRecord
处理器以及关联的 RecordReader
和 RecordSetWriter
Controller 服务系列。此功能在 Apache NiFi 1.2.0 中引入(并在 1.3.0 中得到增强),并允许独立于其格式转换、查询和丰富任意数据流。 Bryan Bende 写了一篇好文章 introductory guide to using the components ,马克·佩恩 (Mark Payne) 在 record conversion process 上撰写了大量文章。和 realtime querying ,以及 RecordPath Guide是一个综合性的引用资源。
将流文件内容转换为批处理 API 的正确形式后,您可以使用 InvokeHTTP
执行查找操作,并处理将包含 HTTP 响应的传出流文件,或者您可以将新的 LookupRecord
处理器与 LookupService
Controller 服务结合使用,其中包括 ScriptedLookupService
,它允许您编写任意 Python/Groovy/Ruby 代码来执行查找操作(即用于丰富记录的 HTTP 调用)。
您可能还对 PartitionRecord
感兴趣,它允许根据某些 RecordPath 表达式对“类似”记录进行分组(即过滤不良数据记录、不相关记录等)。最后,为了完整起见,还有您可能感兴趣的 QueryRecord
、SplitRecord
和 UpdateRecord
处理器。
在 1.2.0 之前,可能需要像 ConvertCSVToJSON
和 SplitText
这样的单独转换处理器,但这种新范例应该很适合您的用例。
关于javascript - Apache NiFi 1.3 : How would I approach passing sets of vin #s through the htsa. dot.gov API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791526/