Flink四种选择Key的方法
Posted 过往记忆大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink四种选择Key的方法相关的知识,希望对你有一定的参考价值。
在中有许多函数需要我们为其指定key,比如groupBy
,Join中的where
等。如果我们指定的Key不对,可能会出现一些问题,正如下面的程序:
上面的代码没有任何语法错误,但是我们编译运行这个程序,就会出现以下的异常信息:
很显然,上面groupBy(0)
函数需要我们指定一个key,但是我们为其指定了值为0,而0仅仅对tuple类型的数据有效,所以才导致上面的异常。中指定key的值主要有以下四种方法:
指定key表达式(key expressions)
指定key选择函数
一个或多个字段位置键(field position keys) ,这个仅仅对Tuple类型的DataSet有效)
Case Class中的字段
下面我将一一介绍这四种方法的使用。
指定key expressions
键表达式指定DataSet中元素的一个或多个字段。 每个键表达式是公共字段的名称或getter
方法。点符号可以用于表示整个对象。"*"
key表达式表示选择所有的字段。具体使用如下:
这个例子中,需要指定key的函数是groupBy
,我们将WC
样本类中的word
字段作为key表达式,所以上面的代码将会对WC
样本类中的word
字段进行分组。
指定Key选择函数
key选择器函数从DataSet中的元素提取键值。如下:
我们指定了_.word
选择函数,这样上面的groupBy
函数将会对WC
样本类中的word
字段进行分组。
指定Field Position
如果你的DataSet中存储的元素类型是Tuple,那么我们可以指定Tuple中的Field Position,使用如下:
正如上面代码,我们将Tuple中的第一和第二个field作为key传入groupBy
,这样只要Tuple中第一和第二个field相同的元素将会分组到一起。
指定Case Class中的Fields
如果你的DataSet中存储的元素类型是样本类(Case Class),那么我们是可以直接指定Case Class中Field的名字,如下:
如何解决文章开头的问题
现在我们已经学习了四种指定key的方法,那么文章中最开始那个例子该如何指定我们的key呢?很好办,这里最少有三种方法解决:
通过指定key expressions实现
因为我们的DataSet中存储的类型是String,我们可以指定“*”
来选择元素中的所有字段,如下:
.groupBy(
"*"
)
以上是关于Flink四种选择Key的方法的主要内容,如果未能解决你的问题,请参考以下文章 FLink四种图 以及 数据在 taskManager 之间的流转 Java必修课通过Value获取Map中的键值Key的四种方法 |