Flink 实时计算 -- 1.9 SQL使用注意点

前言

Flink 1.9 版本开源了很多 Blink 方面的功能,尤其是在 SQL 方面,这使得我们在开发 Flink 实时任务变得更加方便。目前 Blink SQL 支持了 Create Table 功能,以及维表的功能。我们的实时任务整体流程为,读取Kafka的数据,然后去关联 HBase 维表的数据,最后在输出到 Kafka 中,虽然整体流程跑通,但是其中也遇到了很多坑,这里记录一下,和大家一起分享,避免以后再遇到类似的坑。

Flink SQL Row 类型使用

Flink SQL Row 字段,整体你可以将其理解为一个 Map,Key 为字段的名称,Value 为字段的数据类型。你能够在里面再次定义你的数据类型,比如:

col Row< name varchar,age int,likes varchar,city varchar>
col1 Row( name varchar,age int,likes varchar,city varchar)

上面定一个两个 Row 字段,一个是 col,一个是col1。你可以使用()或者也可以使用<>,这两个都是等价的。

一般我们会直接 Kafka 里面的数据,Kafka 的数据格式通常是 Json 格式,Json 数据你可以将其理解为一个具有数据模式的数据类型,但有一种情况,就是在 Json 数据中,会存在再次嵌套数据的情况,比如下面这种情况:

{
"name" : "hello_world",
"info" : {
"city" : "chengdu",
"like" : "火锅",
"play" : "LOL"
}
}

针对上面的 Json 格式里面 info 字段,就是一种镶嵌情况,具体在 Flink SQL DDL 里面进行定义时,可以定义为下面 DDL 语句:


name varchar,
info Row<city varchar,like varchar,play varchar>

Flink读取 kafka 中的数据,支持 Json 数据嵌套。

Flink SQL DDL user 字段使用

之前在使用 Flink SQL 来读取 Kafka 数据,里面 Json 中有个 user 字段,我在 SQL 语句中定义时,运行时报出 SqlParserException: SQL parse failed.Encountered “user” at line 1,column 4177 异常:
在这里插入图片描述
我刚开始以为是我的 SQL 任务代码写错了,毕竟字段太多了,很容易出错。最后在本地测试发现,user 字段是Flink SQL中的关键字,我去掉 user 字段的定义任务就能够运行起来。我个人认为应该是 Flink SQL中由于 user 是关键字,所以在 SQL 任务中不支持,结果报错。当然这是我的个人结论,如果有错,欢迎指出。

HBase 维表字段数据类型映射

我们的实时任务使用到 HBase 作为维表,使用 Flink SQL 直接定义了 HBase 维表的相关配置属性,在使用的时候,报出了 TimeOut 错误,最后发现是因为在 Flink SQL中定义的 HBase 维表的字段类型和在 HBase 数据表中实际存储数据的字段类型没有对应上,比如在 Flink SQL 中定义的 Age字段为 smallint 类型,但是实际上在 HBase中存储的字段为 String 类型字节数组,String 当然不能转 smallint 类型,然后就报错了。所以在 Flink SQL 中定义HBase维表时,具体使用的字段的数据类型要和 HBase 表具体存储的字段类型保持一致。

Short 变为SmallInt类型

之前在Flink SQL使用中,有个字段在Java类型中是Short类型,然后我再使用Flink SQL定义的时候,也将该字段定义为Short类型,结果在运行的时候,发现报错信息为Flink 不支持自定义类型。最后将Short定义换成SmallInt就正常运行。具体的数据类型使用,可以参考官方文档。

下面是个人微信公众号:LakeShen,专注于大数据、Flink 实时计算、程序员技术成长和经验分享、互联网大厂实习和工作经验。欢迎大家关注,一起学习交流。

回复 ‘’Flink‘’获取我个人整理的 Flink 学习书籍、论文、以及Flink 学习博客推荐。Flink学习,我与你一起前行。
LakeShen

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: flink 实时计算是一种流式计算框架,可以用于实时处理大规模数据。词频统计是 flink 实时计算的一个常见应用场景,可以用于统计文本中每个单词出现的频率。初体验可以通过编写简单的代码实现,对 flink 实时计算有一个初步的了解。 ### 回答2: Flink 是一种流数据处理框架,可以进行实时计算和批处理,适用于对实时数据进行分析和处理的场景。其中,词频统计是一个常用的实时应用场景,可以用于分析用户搜索的热门关键词、监控社交媒体的流行话题等等。 使用 Flink 进行词频统计的过程如下: 1. 从数据源中读取数据:可以使用 Flink 提供的多种数据源,例如 Kafka、HDFS、本地文件等等; 2. 进行数据清洗:对数据进行过滤、去重等操作,保证数据的准确性和完整性; 3. 进行分词:将读取到的文本数据进行分词,可以使用开源的中文分词工具,例如 HanLP、jieba 等等; 4. 进行词频统计:通过对每个词语进行计数,得到每个词语的出现次数; 5. 输出结果:将词频统计的结果输出到指定的数据源上,例如 Kafka、HDFS等等。 在实际应用中,基于 Flink 的词频统计可以应用于多种场景。例如在电商网站中,词频统计可以用于分析用户搜索热度,从而为商家提供商品推荐,优化营销策略。又例如在新闻媒体中,词频统计可以用于监控事件热,分析社交媒体上的流行话题,帮助新闻工作者快速捕捉社会热。 总之,通过 Flink 实现实时的词频统计,可以帮助企业和个人快速获取实时数据,优化决策和服务。对于初学者来说,可以从简单的单词计数入手,逐步深入理解流计算和分布式计算的基本概念,提高数据处理的效率和准确性。 ### 回答3: Flink 是现代流式处理引擎,广泛用于实时计算场景。它通过高速数据流的处理能力,使得实时计算成为了可能。在 Flink 中,词频统计是一个非常重要的实时计算应用场景,其主要用途是统计某个文本中每个单词出现的频次,从而揭示文本的特和蕴含的信息。 词频统计初体验中,我们需要先确定数据的输入源,这可以是数据流(Stream)或数据集(DataSet)。对于流式输入源,我们需要使用 Flink 的 DataStream API,而对于有界的离线输入源,我们需要使用 Flink 的 Batch API。 在进一步设计统计模型之前,我们需要对数据进行预处理,以清理噪声和冗余信息,并将其转换为可用于分析的形式。Flink 提供了许多数据预处理操作,我们可以将其组合使用,例如 map()、filter()、flatmap() 和 reduce() 等等。这些操作可以将数据流转换为指定格式的数据集,以方便数据分析。对于文本数据,我们通常需要将其转换为单词流,以便进行词频统计。 在 Flink 中,我们可以使用 Window 操作将数据流分成可管理的时间窗口,以便对其进行分析。常见的窗口类型有滚动窗口、滑动窗口、会话窗口等等。在词频统计场景中,我们可以使用 Tumbling Window 将数据流划分为固定大小的窗口,然后对每个窗口中的所有单词进行计数。 在得到了每个窗口内所有单词的计数值后,我们可以再进一步使用 reduce() 操作进行累计计算,得到每个单词的总出现次数。这些数据可以存储到外部系统中,如数据库或文件系统中,以方便后续分析或展示。 总之,通过实践词频统计场景,我们可以深入理解 Flink 流式处理引擎的设计理念和使用方法。同时,我们也能够更好地掌握实时数据流处理的实践中常见的数据处理和分析方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值