【大数据】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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语