Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我们为什么不用 Select * 吗?

我们为什么不用 Select * 吗?

作者头像
哲洛不闹
发布于 2019-04-25 06:31:51
发布于 2019-04-25 06:31:51
1.7K0
举报
文章被收录于专栏:java一日一条java一日一条

流计算 Oceanus 简介

流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点的企业级实时大数据分析平台。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。

本文将为您详细介绍如何使用自定义表值函数(UDTF),并将处理后的数据存入 MySQL 中。

前置准备

创建流计算 Oceanus 集群

在流计算 Oceanus 产品活动页面 1 元购买 Oceanus 集群。进入 Oceanus 控制台 [1],点击左侧【集群管理】,点击左上方【创建集群】,具体可参考 Oceanus 官方文档 创建独享集群 [2]。

创建 MySQL 实例

进入 MySQL 控制台 [3],点击【新建】。具体可参考官方文档 创建 MySQL 实例 [4]。进入实例后,单击右上角【登陆】即可登陆 MySQL 数据库。

创建 MySQL 表
代码语言:sql
AI代码解释
复制
-- 建表语句,用于向 Source 提供数据
CREATE TABLE `udtf_input` (
  `id`    int(10) NOT NULL,
  `name`  varchar(20) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
​
-- 插入数据
INSERT INTO `udtf_input` (`id`, `name`) VALUES (1, 'Oceanus-1');
INSERT INTO `udtf_input` (`id`, `name`) VALUES (2, 'Oceanus-2');
INSERT INTO `udtf_input` (`id`, `name`) VALUES (3, 'Oceanus-3');-- 建表语句,用于接收 Sink 端数据
CREATE TABLE `udtf_output2` (
  `id`      int(10) NOT NULL,
  `name`    varchar(20) DEFAULT '',
  `product` varchar(20) DEFAULT '',
  `num`     varchar(20) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

开发 UDTF

这里使用 TableFunction 自定义一个 UDTF。这个 UDTF 使用-将传入进来的字段切分成两个字段后返回。

1. 代码编写

在本地IDE中创建 maven 项目,编写自定义函数 UDTF 的代码。

代码语言:java
AI代码解释
复制
// 类名:SplitRowUdtf
package demos.UDTF;import org.apache.flink.table.annotation.DataTypeHint;
import org.apache.flink.table.annotation.FunctionHint;
import org.apache.flink.table.functions.TableFunction;
import org.apache.flink.types.Row;@FunctionHint(output = @DataTypeHint("ROW<product STRING, num STRING>"))
public class SplitRowUdtf extends TableFunction<Row> {
    public void eval(String a) {
        String[] split = a.split("-");
        String product = split[0];
        String num = split[1];
        collect(Row.of(product,num));
    }
}
2. 项目打包

使用 IDEA 自带打包工具 Build Artifacts 或者命令行进行打包。 命令行打包命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean package

命令行打包后生成的 JAR 包可以在项目 target 目录下找到。

注意:与 Flink 相关的核心依赖包可以不打进 JAR 包,Oceanus 平台已提供,可将 scope 设置为 provided。具体可参考 Flink 实践教程:入门9-JAR 作业开发[5]。

流计算 Oceanus 作业

上传依赖

在 Oceanus 控制台,点击左侧【依赖管理】,点击左上角【新建】新建依赖,上传本地 JAR 包。

创建 SQL 作业

在 Oceanus 控制台,点击左侧【作业管理】,点击左上角【新建】新建作业,作业类型选择 SQL 作业,点击【开发调试】进入作业编辑页面。 单击【作业参数】,在【引用程序包】处选择刚才上传的 JAR 包。

1. 创建 Function
代码语言:sql
AI代码解释
复制
CREATE TEMPORARY SYSTEM FUNCTION SplitRowUdtf  AS 'demos.UDTF.SplitRowUdtf';

SplitRowUdtf代表创建的函数名,demos.UDTF.SplitRowUdtf代表代码所在路径。

2. 创建 Source
代码语言:sql
AI代码解释
复制
CREATE TABLE `mysql_cdc_source_table` (
  `id`     INT,
  `name`   STRING,
  PRIMARY KEY (`id`) NOT ENFORCED -- 如果要同步的数据库表定义了主键, 则这里也需要定义
) WITH (
  'connector' = 'mysql-cdc',    -- 固定值 'mysql-cdc'
  'hostname' = 'xx.xx.xx.xx',    -- 数据库的 IP
  'port' = 'xxxx',              -- 数据库的访问端口
  'username' = 'root',          -- 数据库访问的用户名(需要提供 SHOW DATABASES、REPLICATION SLAVE、REPLICATION CLIENT、SELECT 和 RELOAD 权限)
  'password' = 'xxxxxxxxx',     -- 数据库访问的密码
  'database-name' = 'testdb',   -- 需要同步的数据库
  'table-name' = 'udtf_input'   -- 需要同步的数据表名
);
3. 创建 Sink
代码语言:sql
AI代码解释
复制
CREATE TABLE `jdbc_upsert_sink_table` (
    `id`      INT,
    `name`    VARCHAR,
    `product` VARCHAR,
    `num`     VARCHAR,
    PRIMARY KEY(id) NOT ENFORCED
) WITH (
    -- 指定数据库连接参数
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://xx.xx.xx.xx:xxxx/testdb?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai',  -- 请替换为您的实际 MySQL 连接参数
    'table-name' = 'udtf_output2',         -- 需要写入的数据表
    'username' = 'root',                   -- 数据库访问的用户名(需要提供 INSERT 权限)
    'password' = 'xxxxxxxxx',              -- 数据库访问的密码
    'sink.buffer-flush.max-rows' = '200',  -- 批量输出的条数
    'sink.buffer-flush.interval' = '2s'    -- 批量输出的间隔
);
4. 编写业务 SQL
代码语言:sql
AI代码解释
复制
-- cross join 写法
INSERT INTO jdbc_upsert_sink_table
SELECT
S.id,S.name,T.product,T.num
FROM mysql_cdc_source_table  AS S,
lateral table(SplitRowUdtf(name)) AS T(product,num);-- left join 写法
INSERT INTO jdbc_upsert_sink_table
SELECT
S.id,S.name,T.product,T.num
FROM mysql_cdc_source_table  AS S
left join lateral table(SplitRowUdtf(name)) AS T(product,num) on true;

UDTF 支持 cross join 和 left join,在使用 UDTF 时需要添加 lateral 和 table 关键字。使用 cross join 时,左表的每一行数据都会关联上 UDTF 产出的每一行数据,如果 UDTF 不产出任何数据,则这 1 行不会输出;使用 left join 时,左表的每一行数据都会关联上 UDTF 产出的每一行数据,如果 UDTF 不产出任何数据,则这 1 行的 UDTF 的字段会用 null 值填充。

总结

本文首先在本地开发 UDTF 函数,将其打成 JAR 包后上传到 Oceanus 平台引用。接下来使用 MySQL CDC 连接器获取udtf_input表数据,调用 UDTF 函数将name字段切分成两个字段后存入 MySQL 中。UDTF 可以通过多次调用 collect() 实现将 1 行的数据转为多行返回。还可以将返回值声明成 Tuple 或 Row 类型即可实现 1 列转多列(如本文所示)。

  • 自定义标量函数(UDF)只能将0个、1个或多个标量值映射到一个新的标量值。

参考链接

[1] Oceanus 控制台:https://console.cloud.tencent.com/oceanus/overview

[2] 创建独享集群:https://cloud.tencent.com/document/product/849/48298

[3] MySQL 控制台:https://console.cloud.tencent.com/cdb

[4] 创建 MySQL 实例:https://cloud.tencent.com/document/product/236/46433

[5] Flink 实践教程:入门9-JAR 作业开发:https://cloud.tencent.com/developer/article/1907822

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你还在 Select * 吗?
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
良月柒
2019/03/20
3720
你还在 Select * 吗?
别一直用 Select * 了
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
朱小五
2020/03/05
4730
除了不要 SELECT * ,数据库还有哪些技巧
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
JAVA葵花宝典
2019/07/30
5900
除了不要 SELECT * ,程序员使用数据库还应知道的11个技巧!
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
帅地
2019/10/08
5380
除了不要 SELECT * ,程序员使用数据库还应知道的11个技巧!
除了不要 SELECT * ,数据库还有哪些技巧
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
芋道源码
2019/05/28
4990
除了不要 SELECT * ,数据库还有哪些技巧?
能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盘和内存消耗越小越好嘛。
JavaFish
2019/10/17
3580
Windows大面积蓝屏原因找到了,真TM尴尬。。。
上周五Windows系统突然大面积蓝屏(BSOD)登上各大平台热搜,不少打工人表示:感谢微软“帮忙”放了半天假。
SQL数据库开发
2024/07/24
1570
Windows大面积蓝屏原因找到了,真TM尴尬。。。
MySQL性能优化的最佳20+条经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例: 上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。
用户7657330
2020/08/14
6750
MySQL性能优化的最佳20+条经验
MySQL 数据库规范--开发篇
table name = test、column1 = id、column2 = name.
用户1081422
2020/04/08
1.7K0
企业面试题|最常问的MySQL面试题集合(二)
嵌套查询 用一条SQL语句得结果作为另外一条SQL语句得条件,效率不好把握 SELECT * FROM A WHERE id IN (SELECT id FROM B)
民工哥
2020/09/16
1.9K0
企业面试题|最常问的MySQL面试题集合(二)
「mysql优化专题」你们要的多表查询优化来啦!请查收(4)
相信这内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上我就不贴出来了。这图只是让大家回忆一下,各种连接查询。 然后要告诉大家的是,需要根据查询的情况,想好使用哪种连接方式效率更高。
java进阶架构师
2018/08/15
2.1K0
「mysql优化专题」你们要的多表查询优化来啦!请查收(4)
13000字!最常问的MySQL面试题集合
问题1:char、varchar的区别是什么? varchar是变长而char的长度是固定的。如果你的内容是固定大小的,你会得到更好的性能。
杰哥的IT之旅
2020/11/03
9500
【mysql系列】细谈explain执行计划之“谜”
我们先了解一下explain语法和相关理论知识。 语法: EXPLAIN SELECT select_options;
沁溪源
2020/10/28
9870
【mysql系列】细谈explain执行计划之“谜”
MySQL 性能优化总结
https://www.cnblogs.com/joeyJss/p/11096597.html
Lenis
2019/12/25
1.1K0
MySQL 性能优化总结
MySQL数据库:SQL优化与索引优化
假如有联合索引 (emp_no 、title、from_date ),那么下面的 SQL 中 emp_no 可以用到索引,而title 和 from_date 则使用不到索引。
全栈程序员站长
2022/06/29
1.5K0
[MySQL]select和where子句优化
数据库优化: 1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化 2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置 3.在数据库级别进行优化,在硬件级别进行优化,平衡可移植性和性能 4.合适的结构,合适的数据类型;执行频繁更新的应用程序大量表(少列);分析大量数据的应用程序少量表(多列);选择合适的存储引擎和索引; 5.压缩适用于InnoDB表的各种工作负载,以及只读MyISAM表 6.选择合适的锁定策略;InnoDB存储引擎可以处理大多数锁定问题 7.配置的主要内存区域是InnoDB缓冲池和MyISAM密钥缓存。 8.优化select语句,这方面技巧同样适用于其他带where的delete语句等,在where子句的列上设置索引;索引对于引用多个列如join和外键尤其重要
唯一Chat
2019/09/10
1.8K0
2020最新版MySQL数据库面试题(三)
select r.*,s.* from r full join s on r.c=s.c
码农编程进阶笔记
2021/07/20
6920
2020最新版MySQL数据库面试题(三)
mysql慢查询优化方法_MySQL查询优化
’mysql慢查询优化 第一步:开启mysql慢查询日志,通过慢查询日志定位到执行较慢的SQL语句。 第二步:利用explain关键字可以模拟优化器执行SQL查询语句,来分析SQL查询语句。 第三步:通过查询的结果进行优化。
全栈程序员站长
2022/11/07
16.1K0
mysql慢查询优化方法_MySQL查询优化
MySQL SQL语句是如果被执行的?(1)原
如上一个SQL语句,发送到MySQL服务器之后,会做什么,如何识别上边语句并返回结果?下面我们来详细说明这个过程。
兜兜毛毛
2020/04/23
1.2K0
优化 SQL SELECT 语句性能的 6 个简单技巧
SELECT语句的性能调优有时是一个非常耗时的任务,在我看来它遵循帕累托原则。20%的努力很可能会给你带来80%的性能提升,而为了获得另外20%的性能提升你可能需要花费80%的时间。除非你在金星工作,那里的每一天都等于地球上的243天,否则交付期限很有可能使你没有足够的时间来调优SQL查询。 根据我多年编写和运行SQL语句的经验,我开始开发一个检查列表,当我试图提高查询性能时供我参考。在进行查询计划和阅读我使用的数据库文档之前,我会参考其中的内容,数据库文档有时会很复杂。我的检查列表绝对说不上全面或科学,它
小小科
2018/05/04
1.8K0
优化 SQL SELECT 语句性能的 6 个简单技巧
相关推荐
你还在 Select * 吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档