FlinkSQL-UDF自定义数据源

昨天遇到了一个比较好玩的需求,要测试Flink-iceberg的版本问题
同时不能改动线上flink和iceberg的版本

平台已经提供了,在iceberg专属的FlinkSQL端是可以勾选iceberg版本的
但是自定义数据源插入iceberg一般用的是jar包,如何不通过jar直接通过SQL生成自定义数据源

阿没错!那就是我们万能的UDF啦!UDF写一个connector,类似data-gen,想一想都很兴奋有木有,然后我发现,好像是没有这样的接口诶
但是没有关系!函数可以实现万物,本身计算机大部分都是函数做得,如果你觉得函数做不了,那只是因为自己实现不了这样的函数

在官方网站中我找到了灵感,一列对多列输出!
好了就是你了,用datagen控制生成速率,输出一个无效值,然后通过接收无效值来生成我自己的行,好一个偷天换日呀
 

那么直接用Java来实现flink UDF,接受一行,然后输出自己任意想模拟的数据

package udf2;

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;

import java.util.Random;

@FunctionHint(output = @DataTypeHint("ROW<id BIGINT, data1 STRING, data2 INT, data4 DOUBLE>"))
public class generateRowUdtf extends TableFunction<Row> {
    public void eval(String a) {
        Random random = new Random();
        long id = Math.abs(random.nextLong()) % 20000;
        String data1 = Math.abs(random.nextInt()) % 2000000 + "";
        int data2 = Math.abs(random.nextInt()) % 2000;
        double data4 = Math.abs(Math.random() * 2000 + 1);
        collect(Row.of(id,data1,data2,data4));
    }
}

然后UDF上传,写下如下SQL,对这个表进行连接操作,SQL可以在本地进行测试~直接print即可看到效果,非常滴神奇~ 这样子我们的自定义生成器就做好啦(全是api,你做了个锤子)

CREATE TEMPORARY table test_insert(
	id2 String
)WITH(
	'connector' = 'datagen',
	'rows-per-second'='100',
	'fields.id2.kind'='random',
	'fields.id2.length'='8'
);
CREATE TEMPORARY SYSTEM FUNCTION generateRowUdtf  AS 'udf2.generateRowUdtf';

insert into xxx
SELECT T.id, T.data1, T.data2, T.data4
FROM test_insert AS S
left join lateral table(generateRowUdtf(id2)) AS T(id,data1,data2,data4) on true;

FlinkSQL中的数据源可以通过使用connector来定义。在给出的引用中,有两个例子可以作为参考。 引用[1]中的例子展示了如何使用`datagen` connector来创建一个临时表,并通过`generateRowUdtf`函数生成新的行。具体步骤如下: 1. 创建一个临时表`test_insert`,并使用`datagen` connector作为数据源。可以通过设置参数来控制生成速率和字段的属性。 ```sql CREATE TEMPORARY table test_insert( id2 String ) WITH( 'connector' = 'datagen', 'rows-per-second'='100', 'fields.id2.kind'='random', 'fields.id2.length'='8' ); ``` 2. 创建一个系统函数`generateRowUdtf`,并将其指定为`lateral table`的参数。这个函数可以根据输入的参数生成新的行。 ```sql CREATE TEMPORARY SYSTEM FUNCTION generateRowUdtf AS 'udf2.generateRowUdtf'; ``` 3. 使用`lateral table`和`generateRowUdtf`函数来生成新的行,并将其与`test_insert`表进行连接操作。 ```sql insert into xxx SELECT T.id, T.data1, T.data2, T.data4 FROM test_insert AS S left join lateral table(generateRowUdtf(id2)) AS T(id,data1,data2,data4) on true; ``` 引用中的例子展示了如何使用自定义UDF作为数据源。具体步骤如下: 1. 创建一个自定义的connector,类似于`data-gen` connector。这个connector可以根据你的需求生成数据。 2. 创建一个UDF函数,该函数可以根据输入参数生成多列输出。 3. 使用自定义的connector和UDF函数来生成数据。 以上是两个例子,你可以根据你的需求选择适合的方法来定义FlinkSQL中的数据源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值