【大数据】NiFi 中的处理器(一):GenerateTableFetch

2023-11-08 04:12

本文主要是介绍【大数据】NiFi 中的处理器(一):GenerateTableFetch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NiFi 中的处理器(一):GenerateTableFetch

  • 1.简介
  • 2.应用场景
  • 3.示例
    • 3.1 案例一:无输入流文件,来源表含增量字段
    • 3.2 案例二:无输入流文件,不含增量字段
    • 3.3 案例三:无输入流文件,带自增 id
    • 3.4 案例四:有来源流文件,查多表,无增量字段
    • 3.5 案例五:有来源流文件,查多表,带增量字段

1.简介

该处理器用于 生成在表中执行分页查询的 SQL 查询语句,分区(属性 partition)大小以及表的行数决定页面的大小和数量以及生成的流文件。此外,可以通过设置最大值列(Max-Value)来实现增量抓取数据,处理器会跟踪列的最大值,从而 只抓取列值超过已记录到的最大值的行,该处理器只在主节点上运行,可以接受传入的连接。

提供传入连接与否,处理器的行为是不同的:

  • 如果没有指定传入连接,处理器将根据指定的处理器调度生成 SQL 语句。许多字段都支持表达式语言,但是没有流文件属性可用。但是,可以使用变量注册表评估属性。
  • 如果指定了传入连接,并且处理器任务没有可用的流文件,则不执行任何工作。
  • 如果指定了传入连接,并且处理程序任务有可用流文件,则流文件的属性可以在表达式语言中用于表名等字段。但是,Max-Value 列和返回字段的列必须为空或者引用每个指定表中可用的列(多表查询,字段设置成属性表达式语言就可以了)。

关于该组件的相关配置在 官方文档 中已经描述的很清楚了,此处不再赘述。

2.应用场景

GenerateTableFetch 使用其属性和指定的数据库连接生成包含 SQL 语句的流文件,这些 SQL 语句可用于从表中获取分页的数据。GenerateTableFetch 执行对数据库的查询,以确定当前行数和最大值,如果指定了最大值列,则收集其最大值列的值大于 GenerateTableFetch 最后观察到的值的行数。这允许增量获取新行,而不是每次生成 SQL 来获取整个表。如果没有设置最大值列,那么处理器将生成 SQL 来每次获取整个表。

为了生成将获取分页数据的 SQL,默认情况下 GenerateTableFetch 将生成基于最大值列(如果存在)对数据排序的 SQL,并使用结果集的行号来确定每个页面。例如,如果最大值列是一个整数 id,分区大小为 10 10 10,那么第一个页面的 SQL 可能是 SELECT * FROM myTable LIMIT 10,第二个页面可能是 SELECT * FROM myTable OFFSET 10 LIMIT 10,依此类推。

根据数据库、行数等,对数据进行排序可能是一项昂贵的操作。或者,也可以使用 Column for Value Partitioning 属性指定一个列,该列的值将用于确定页面。如果设置了,GenerateTableFetch 将确定列的最小值和最大值,并使用最小值作为初始偏移量。然后,获取页面的 SQL 基于这个初始偏移量和值的总差(即最大值 - 最小值)除以页面大小。例如,如果列 id 用于值分区,然后列值 100 100 100 200 200 200,页面大小为 10 10 10 的 SQL 来获取第一页可能是 SELECT * FROM myTable id > = 100 and id < 110,第二页可能是 SELECT * from myTable id > = 110 and id < 120 等等。

重要的是,将用于值分区的列设置为可以强制类型为长整数(即不是日期或时间戳)的列,并且为了获得最佳性能,列值是均匀分布的,而不是稀疏的。作为上面的反例,考虑一个列 id,其值分别为 100 100 100 2000 2000 2000 30000 30000 30000。如果分区大小为 100 100 100,那么列值相对稀疏,因此 “第二页” 的 SQL 将返回零行,直到查询中的值变为 id >= 2000 为止,每个页面都将返回零行。另一个反例是值不是均匀分布的:假设一个值为 100 、 200 、 201 、 202 、 … 299 100、200、201、202、…299 100200201202299。然后,第一个页面的 SQL 将返回值为 id = 100 的一行,第二个页面将返回值为 200 … … 299 200…… 299 200……299 100 100 100 行。这可能导致下游处理时间不一致,因为页面可能包含非常不同的行数。由于这些原因,建议使用足够密集(而不是稀疏)且分布相当均匀的列进行值分区。

3.示例

首先配置好数据库 DBCPConnectionPool

在这里插入图片描述
然后配置 GenerateTableFetch 中的 Database Connection Pooling Service

在这里插入图片描述

3.1 案例一:无输入流文件,来源表含增量字段

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

保存状态:

在这里插入图片描述

3.2 案例二:无输入流文件,不含增量字段

在这里插入图片描述
输出:

在这里插入图片描述

3.3 案例三:无输入流文件,带自增 id

在这里插入图片描述

当然,实际增量抽取时,max-value 也设置成 id

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.4 案例四:有来源流文件,查多表,无增量字段

在这里插入图片描述

使用 GenerateFlowFile 配置一个多表表名数组,切割 json,然后将表名提取到属性中:

在这里插入图片描述

在这里插入图片描述

输出结果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.5 案例五:有来源流文件,查多表,带增量字段

只需将案例四中 json 修改一下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

输出结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

状态:

在这里插入图片描述

这篇关于【大数据】NiFi 中的处理器(一):GenerateTableFetch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/367808

相关文章

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据