怎样使hive数据库的查询更快速(Springboot整合presto实现hive 非分桶表的快速分页查询)

wylc123 1年前 ⋅ 738 阅读

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;
    }
}

相关文章推荐

全部评论: 0

    我有话说: