扩展:事件流上的实时SQL(Real-Time SQL On Event Streams)

这个新版本最令人兴奋的特性之一就 是QueryRecord处理器和Record Reader和Record Writer组件。如果你不熟悉这些组件,那么有一篇博客文章解释了这些组件的工作原理。
这个由Apache Calcite支持的新处理器允许用户编写SQL SELECT语句,以在数据流经系统时运行数据。 NiFi中的每个FlowFile都可以视为一个名为FLOWFILE的数据库表。这些SQL查询可用于过滤数据中的特定列或字段,重命名这些列/字段,过滤行,对数据执行计算和聚合,路由数据,或者任何您可能希望使用的SQL。所有这一切都来自最广为人知和使用的领域特定语言的舒适范围。

  • 总体流程:

  • csv内容:
purchase_no, customer_id, item_id, item_name, price, quantity
10280, 40070, 1028, Box of pencils, 6.99, 2
10280, 40070, 4402, Stapler, 12.99, 1
12440, 28302, 1029, Box of ink pens, 8.99, 1
28340, 41028, 1028, Box of pencils, 6.99, 18
28340, 41028, 1029, Box of ink pens, 8.99, 18
28340, 41028, 2038, Printer paper, 14.99, 10
28340, 41028, 4018, Clear tape, 2.99, 10
28340, 41028, 3329, Tape dispenser, 14.99, 10
28340, 41028, 5192, Envelopes, 4.99, 45
28340, 41028, 3203, Laptop Computer, 978.88, 2
28340, 41028, 2937, 24\" Monitor, 329.98, 2
49102, 47208, 3204, Powerful Laptop Computer, 1680.99, 1

CSV Reader:
为了开始读取和写入数据,如上所述,我们将需要一个 Record Reader service 。 我们想分析CSV数据并将其转换成JSON数据。 所以要做到这一点,我们需要一个 CSV Reader 和一个 JSON Writer

幸运的是,大多数这些属性的默认值对大多数情况都很有用,但是如果不是逗号,您可以选择要使用的分隔符。您可以选择是否跳过第一行,将其视为标题等。对于我的情况,我将设置“ Treat First Line as Header ”属性为“true”,因为我的数据包含一个标题行,我不想要作为记录处理。第一个属性是非常重要的。 “ Schema Access Strategy ”用于指导读者如何获取模式。默认情况下,它被设置为“ Use String Fields From Header ”。既然我们也要写数据,不过,我们还是必须配置一个模式。所以对于这个演示,我们将把这个策略改为“ Use 'Schema Name' Property 。这意味着我们要从Schema Registry中查找模式。因此,我们现在将不得不创建我们的 Schema Registry 。如果我们点击“Schema Registry”属性,我们可以选择“Create new service ...”:

JsonRecordSetWriter
现在我们可以添加我们的JsonRecordSetWriter控制器服务。当我们配置这个服务时,我们看到了一些熟悉的选项来指示如何确定模式。对于“ Schema Access Strategy ”,我们将再次使用默认的“ Use 'Schema Name' Property ”。另请注意,“ Schema Name ”属性的默认值使用表达式语言来引用名为“schema.name”的属性。这提供了一个非常好的灵活性,因为现在我们可以重新使用我们的record read和record write,并通过使用UpdateAttribute处理器来指定模式名称来传递模式。我们将“Schema Registry”属性设置为我们刚才创建和配置的AvroSchemaRegistry。
因为这是一个Record Writer而不是一个Record Reader,所以我们还有另一个有趣的属性:“Schema Write Strategy”。现在我们已经配置了如何确定数据的模式,我们需要告诉 writer 如何将该模式传达给下一个数据使用者。默认选项是 Set 'schema.name' Attribute 。我们将接受默认。但是我们也可以将整个模式写成FlowFile属性,或者使用一些对Hortonworks模式注册表进行交互的策略。

AvroSchemaRegistry
为了理解数据,record reader 和record writer需要知道与数据关联的模式。一些 record reader (例如,Avro Reader)允许从数据本身读取模式。该模式也可以作为FlowFile属性包含在内。但大多数情况下,它都将通过 Schema Registry 中的名称查询。在这个版本的NiFi中,存在两个Schema Registry实现:基于Avro的Schema Registry服务和用于外部Hortonworks Schema Registry的客户端。

我们将选择创建一个AvroSchemaRegistry。 这里需要注意的是,我们正在读取CSV数据并编写JSON数据 - 那么为什么我们要使用 AvroSchemaRegistry ? 因为这个Schema Registry允许我们使用Apache Avro Schema格式来传递模式,但是这并不意味着正在读取的数据的格式。 使用Avro格式是因为它已经是一种众所周知的存储数据模式的方式。
一旦我们添加了 AvroSchemaRegistry ,我们就可以对其进行配置,并在Properties选项卡中看到它根本没有属性。 我们可以通过添加一个新的用户定义属性来添加一个模式(点击右上角的“添加”/“加号”按钮)。 我们将使用这个作为属性的名称给我们的模式名称“ hello-word ”。 然后我们可以在我们的模式中输入或粘贴。 对于那些不熟悉Avro模式的人来说,它是一种JSON格式的表示,其语法如下:

  • 详细过程:
1. GenerateFlowFile  
 对于这个演示,我们将简单地使用GenerateFlowFile来为其提供数据。 我们将“ Custom Text ”属性设置为上面显示的CSV。 在“ Scheduling ”选项卡中,我将配置处理器每10秒运行一次,这样我就不会将数据泛滥到系统中。
2. UpdateAttribute
我们需要添加一个“schema.name”属性,所以我们将GenerateFlowFile的“ success ”关系路由到UpdateAttribute处理器。 在这个处理器中,我们将添加一个名为“schema.name”的新属性,其值为“hello-world”(以匹配我们添加到AvroSchemaRegistry服务的模式的名称). 因为这是我们在Schema Registry中配置的模式的名称 。 我们将“success”关系路由到QueryRecord。
3. QueryRecord
在我们的Properties选项卡中,我们可以点击“Add Property”按钮添加一个新的属性。 因为我们可以在单个处理器中添加多个SQL查询,所以我们需要一种方法来区分每个查询的结果并适当地路由数据。 因此,属性的名称是匹配查询的数据应该被路由到的关系的名称。 我们将创建两个查询。 第一个将被命名为“over.1000”,并且将包括花费超过$ 1,000.00的任何购买的purchase_no和customer_id字段,并且还将包括名为total_price的新字段,该字段是整个购买的美元金额。 请注意,在NiFi中输入属性的值时,可以使用Shift + Enter在您的值中插入换行符:

voer.1000属性的内容:
SELECT purchase_no, customer_id, SUM(price * quantity) AS total_price
FROM FLOWFILE
GROUP BY purchase_no, customer_id
HAVING SUM(price * quantity) > 1000

largest.order属性的内容:
SELECT purchase_no, customer_id, SUM(price * quantity) AS total_price
FROM FLOWFILE
GROUP BY purchase_no, customer_id
ORDER BY total_price DESC
LIMIT 1


4.两个 UpdateAttribute
接下来,我们将创建两个UpdateAttribute处理器,并将“over.1000”关系连接到第一个 UpdateAttribute处理器, “largest.order”关系连接到第二个 UpdateAttribute处理器 。 这只是给我们一个简单的地方来保存数据,以便我们可以查看它。 我将“fail”关系循环返回到QueryRecord处理器,以便如果评估SQL时出现问题,数据将保留在我的流程中。 我也会自动终止“原始”关系,因为一旦我评估了SQL,我不再关心原始数据。 我也会自动终止每个终端UpdateAttribute处理器的“成功”关系。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值