【问题标题】:How to use parameters in Nifi ExecuteSQL processor?如何在 Nifi ExecuteSQL 处理器中使用参数?
【发布时间】:2019-04-23 17:59:30
【问题描述】:

我希望 Nifi 先读取数据库中的所有人,然后再为每个人读取地址,而不是进行连接。我知道这不是最有效的方法,但我们有一些具体的原因。

“每个人”部分是通过使用 SplitAvro 或 SplitJson 处理器解决的,但我如何获取当前人员的 ID 并将其用作下一个 ExecuteSQL 处理器中的参数?

我已经检查了类似于我想要的东西,但是问题有点老了 (how to pass values dynamically in Apache NiFi from executeSQL to SelectHiveQL)

不过,我猜,上面介绍的解决方案似乎更像是一种解决方法,应该很简单。

(就我而言,我不使用 Hive,两个 ExecuteSQL 处理器我都在 SQl Server DB 上使用查询)

【问题讨论】:

    标签: apache-nifi


    【解决方案1】:

    我承认这是一个复杂的场景,因为您正在执行读取/迭代/查询而不是 JOIN,但如果这是您真正想要做的,我认为 ExecuteSQLRecord 就是您正在寻找的为了。该处理器将执行 SQL 查询并使用配置的 RecordWriter 控制器服务将结果作为记录返回。然后,您可以使用LookupRecord 执行其他查询,它可以连接到任意数据源(尽管目前不支持 RDBMS)以丰富记录格式的数据,或者使用SplitRecord 从单个记录创建流文件并路由到另一个 @ 987654329@处理器,可以使用传入的流文件属性作为SQL的查询参数。

    【讨论】:

    • 是的,我们希望避免重复记录(因为我们最终不得不通过 xslt、jolt 或 groovy 将它们全部加入,正如您在另一个问题中告诉我的那样),当然现实世界是比“人/地址”示例复杂得多。其他原因是因为我们将逐人发送到外部 SOAP Web 服务。除了指定架构的地方(这是可选的)之外,我真的对这些 RecordWriter 和 RecordReader 了解不多,是否有关于它们的其他文档?他们的主要目的是什么?我知道这个问题可能很愚蠢,但我还是新手。
    • 以及如何在下一个 ExecuteSQLRecord 中使用传入的流文件属性作为查询参数?
    • 您不需要查询参数,您可以使用 ExecuteSQLRecord 获取数据库中的所有人员,然后在 LookupRecord 中指向包含人员 ID 的字段以确定要获取的人员来自 SOAP 服务。 NiFi 目前没有 SOAPLookupService,但是,您可能必须编写一个(使用 Java 或使用 ScriptedLookupService)。
    • 我实际上会将数据发送到 SOAP,因此一个简单的 HTTP Post 可能就足够了(尽管我可能需要稍后读取服务器的返回)。 Andy 提到 LookupRecord 不支持 RDBMS,所以这就是我不考虑它的原因,还是它实际上支持?
    • 也许如果你解释你不想做JOIN的原因或者在你的RDBMS中使用一个视图,这会更有意义。就目前而言,听起来您不希望执行此解决方案带来的固有负面影响,但您也不希望以其他方式执行此操作。将数据发送到外部服务(HTTP 或 SOAP)不需要在整个流中使用单独的流文件,只需在 InvokeHTTP 或仍然使用带有 LookupRecord 的记录。请参阅记录中的Mark Payne's introductory article 以了解它们的力量。
    猜你喜欢
    • 2016-09-21
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多