昨晚想从clickhouse读取数据,愣是没找到clickhouse的flink的读取方法,一百度都是slink的,最后是找到一个clickhouse官方提供的jdbc方法,但还是用游标,好吧凑合着用
​​​官方链接​

package redo.source



import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.functions.source.SourceFunction

import java.sql.{Connection, DriverManager, Statement}
import java.util.{Date, Properties}
import scala.util.Random


case class User(user_id:Long,item_id:Long,cate_id:Long,pv:Int,fav:Int,cart:Int,buy:Int,times:Date)

object ClickHouseSources {
def main(args: Array[String]): Unit = {
val env =StreamExecutionEnvironment.getExecutionEnvironment

val sort4 = env.addSource(new mysource_funtions())
sort4.print()
env.execute("connect clickhouse")







}
}
class mysource_funtions extends SourceFunction[User]{
var running = true


override def cancel(): Unit = running=false
override def run(ctx: SourceFunction.SourceContext[User]): Unit = {
// 初始化一个随机数发生器
Class.forName("ru.yandex.clickhouse.ClickHouseDriver")
//连接
val connection: Connection = DriverManager.getConnection( "jdbc:clickhouse://hadoop102:8123/alibaba")
val statement: Statement = connection.createStatement()
//建立查询
val sql = "select*from user"
var res1 = statement.executeQuery(sql)
while(running){
while (res1.next()) {
val user_id = res1.getLong(1)
val item_id = res1.getLong(2)
val cate_id = res1.getLong(3)
val pv=res1.getInt(4)
val fav=res1.getInt(5)
val cart = res1.getInt(6)
val buy = res1.getInt(7)
val times = res1.getDate(8)

ctx.collect(User(user_id,item_id,cate_id,pv,fav,cart,buy,times))
}
connection.close()
cancel()


}
}
}

Flink自定义source读取clickhouse_sql

这是java的读取方法

import ru.yandex.clickhouse.ClickHouseConnection;
import ru.yandex.clickhouse.ClickHouseDataSource;
import ru.yandex.clickhouse.ClickHouseStatement;
import ru.yandex.clickhouse.settings.ClickHouseProperties;
import ru.yandex.clickhouse.settings.ClickHouseQueryParam;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class ClickHouseSurce {


public static void main(String[] args) throws SQLException {

ClickHouseProperties properties = new ClickHouseProperties();
// set connection options - see more defined in ClickHouseConnectionSettings
String url = "jdbc:clickhouse://hadoop102:8123/alibaba";

// set default request options - more in ClickHouseQueryParam
properties.setSessionId("default-session-id");
properties.setDatabase("alibaba");
properties.setHost("hadoop102");



ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties);
String sql = "select * from user";
Map<ClickHouseQueryParam, String> additionalDBParams = new HashMap<>();
// set request options, which will override the default ones in ClickHouseProperties
additionalDBParams.put(ClickHouseQueryParam.SESSION_ID, "new-session-id");


ClickHouseConnection conn = dataSource.getConnection();
ClickHouseStatement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql, additionalDBParams);
while(rs.next()){
Long user_id = rs.getLong(1);
Long item_id =rs.getLong(2);
//System.out.println(user_id+" "+item_id);
}



}


}