1.说明
1.1PrestoDB是facebook开源的支持多数据源混合查询的一个计算引擎,他的最大特点:1.查询速度快 2.支持多数据源在一条SQL语句中混合查询 3.基于内存的查询。当我们安装好PrestoDB,且通过配置多个数据源在Java的Maven项目实现了跨数据源混合查询实验后,我们需要将整个PrestoDB嵌入Java的SpringBoot框架。
(1)如果没有安装PrestoDB的朋友可以通过:https://blog.csdn.net/Sunhighlight/article/details/87906816 实现安装
(2)如果没有实现多数据源配置和打通实验的可以根据:https://blog.csdn.net/Sunhighlight/article/details/89043885 实现PrestoDB的多数据源配置,且通过java的main方法尝试多数据源查询
2.创建Java项目
2.1创建Java的SpringBoot项目,依赖管理使用Maven,JDK版本:1.8
3.整合PrestoDB作为计算引擎
3.1在Maven的Pom文件引入PrestoDB的驱动依赖:
<!-- presto -->
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.269</version>
</dependency>
3.2配置application.yml文件
datasource:
#数据库连接1
presto:
driverClassName: com.facebook.presto.jdbc.PrestoDriver
jdbcUrl: jdbc:presto://10.120.69.50:8090/hive/ods_dev
username: root
注意:
(1)本项目其他数据源使用的是阿里巴巴druid数据库连接池,但是该连接池不支持PrestoDB,如果使用会爆出:java.lang.IllegalStateException: dbType not support错误,故我们用org.apache.tomcat.jdbc.pool.DataSource连接池
3.3创建数据源配置类
package cnki.bdms.util;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
/**
* @author : SongBin
* @date : 2022/1/7
* @description : 数据源配置类
*/
@Configuration
public class PrestoUtils {
@Bean(name = "prestoDataSource")
@ConfigurationProperties(prefix = "spring.datasource.presto")
public DataSource prestoDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "prestoTemplate")
public JdbcTemplate prestoJdbcTemplate(@Qualifier("prestoDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
4.3使用prestoDB直接执行SQL
package cnki.bdms.dataresource.bll.impl;
import cnki.bdms.base.BaseService;
import cnki.bdms.base.StringUtil;
import cnki.bdms.dataresource.bll.IMasterDataViewService;
import cnki.bdms.dataresource.dal.IDataResourceRepository;
import cnki.bdms.dataresource.dal.IMasterBusinessRepository;
import cnki.bdms.dataresource.dal.IMasterDataConfigRepository;
import cnki.bdms.dataresource.entity.businessobject.MasterDataConfigBO;
import cnki.bdms.dataresource.entity.dataobject.DataResource;
import cnki.bdms.dataresource.entity.dataobject.FieldObj;
import cnki.bdms.dataresource.entity.dataobject.MasterBusiness;
import cnki.bdms.dataresource.entity.dataobject.MasterDataConfig;
import cnki.bdms.dataresource.entity.request.MasterDataViewRequest;
import cnki.bdms.dataresource.entity.response.MasterDataConfigResponse;
import cnki.bdms.entity.Tree;
import cnki.bdms.util.BeanUtils;
import cnki.bdms.util.BuildTreeHelper;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.common.utils.StringUtils;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author SongBin
* @since 2021/02/09 上午10:19
*/
@Service
public class MasterDataViewService extends BaseService implements IMasterDataViewService {
@Autowired
@Qualifier("prestoTemplate")
@Lazy
JdbcTemplate prestoTemplate;
/**
* 分页获取主数据列表
* @param request
* @return
*/
@Override
public PageInfo<Map<String, Object>> getMasterDataListForPage(MasterDataViewRequest request) throws IOException {
Integer currentPage = request.getCurrentPage();
Integer pageSize = request.getPageSize();
String dwTableName = "ods_dev_shp_marc_rule";
String sql = String.format("select * from (select * ,(row_number() over()) rn from %s.%s.%s ) t where t.rn between %s and %s","hive",hiveDatabase, dwTableName, (currentPage-1)*pageSize+1, currentPage*pageSize);
List<Map<String, Object>> maps = prestoTemplate.queryForList(sql);
String countsql = String.format("select count(1) from %s.%s.%s","hive",hiveDatabase,dwTableName);
int count = prestoTemplate.queryForObject(countsql,Integer.class);
PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>();
pageInfo.setPageSize(pageSize);
pageInfo.setList(maps);
pageInfo.setPageNum(currentPage);
pageInfo.setTotal(count);
int totalPage = ((count / pageSize) + (count % pageSize == 0 ? 0 : 1));
pageInfo.setPages(totalPage);
return pageInfo;
}
}
注意:本文归作者所有,未经作者允许,不得转载