java实现Presto在线查询Hive

版权声明:学习交流为主,未经博主同意禁止转载,禁止用于商用。 https://blog.csdn.net/u012965373/article/details/84563967
@Override
    public String queryHiveData(String sql, int page, int pageSize, String jobID, long startTime) {
        SQLQueryModel sqlQueryModel = new SQLQueryModel();
        if (!sql.equals(sqlUtil.sqlEmptyCheck(sqlQueryModel, sql, startTime))) {
            return sqlUtil.sqlEmptyCheck(sqlQueryModel, sql, startTime);
        }
        // 添加数据库状态
        onLineQueryMapper.addQueryLog(queryLogTableUtil.addQueryLog(jobID,
                jobID,
                configUtil.readConfig("presto.hive.online.name"),
                configUtil.readConfig("search.engine.presto"),
                Constant.OnLineType,
                sql, "", "",
                dateTimeUtil.timeStampToDateTime(String.valueOf(startTime)), "", "", "",
                configUtil.readConfig("job.running")));
        Connection connection = null;
        Statement stmt = null;
        ResultSet resultSet = null;
        boolean flag = true;
        int colCount = 0;
        List<SQLQuerySubColModel> columnsList = new ArrayList<>();
        List<String> columns = new ArrayList<>();
        List<List<String>> data = new ArrayList<>();
        try {
            Class.forName(Constant.PrestoDriver);
            connection = DriverManager.getConnection(
                    configUtil.readConfig("presto.hive.url"),
                    configUtil.readConfig("presto.hive.username"),
                    null);
            // 添加连接对象
            ConnectUtil.connectionMap.put(jobID, connection);
            stmt = connection.createStatement();
            resultSet = stmt.executeQuery(sql);
            while (resultSet.next()) {
                if (flag) {
                    ResultSetMetaData metaData = resultSet.getMetaData();
                    colCount = metaData.getColumnCount();
                    for (int i = 1; i <= colCount; i++) {
                        columns.add(metaData.getColumnLabel(i));
                        // 初始化字段列表
                        SQLQuerySubColModel sqlQuerySubColModel = new SQLQuerySubColModel();
                        sqlQuerySubColModel.setKey(String.valueOf(i));
                        sqlQuerySubColModel.setName(metaData.getColumnLabel(i));
                        columnsList.add(sqlQuerySubColModel);
                    }
                    flag = false;
                }
                List<String> list = new ArrayList<>();
                for (int j = 0; j < colCount; j++) {
                    list.add(String.valueOf(resultSet.getObject(j + 1)));
                }
                data.add(list);
            }
            // 存储查询结果数据
            queryResultDataServiceImp.StoreSearchResult(columns, data, jobID);
        } catch (Exception error) {
            LOG.error(error.getMessage());
            onLineQueryMapper.updateQueryLog(queryLogTableUtil.updateQueryLog(jobID, "", "",
                    dateTimeUtil.timeStampToDateTime(dateTimeUtil.currentTimeStamp()),
                    String.valueOf(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime), error.getMessage(),
                    configUtil.readConfig("job.failed")));
            // 移除已结束的连接对象
            ConnectUtil.reConnectObj(ConnectUtil.connectionMap, jobID);
            sqlQueryModel.setDataList(null);
            sqlQueryModel.setRunTime(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime);
            sqlQueryModel.setWords(null);
            if (error.getMessage().length() > 100) {
                sqlQueryModel.setErrMsg(error.getMessage().substring(0, 100));
            } else {
                sqlQueryModel.setErrMsg(error.getMessage());
            }
            sqlQueryModel.setJobStatus("Failed");
            return returnResultModel.generateResult(
                    Integer.parseInt(configUtil.readConfig("return.success")),
                    configUtil.readConfig("return.msg.success"),
                    sqlQueryModel);
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
                if (connection != null) {
                    connection.close();
                }
                // 移除已结束的连接对象
                ConnectUtil.reConnectObj(ConnectUtil.connectionMap, jobID);
            } catch (Exception error) {
                LOG.error(error.getMessage());
                onLineQueryMapper.updateQueryLog(queryLogTableUtil.updateQueryLog(jobID, "", "",
                        dateTimeUtil.timeStampToDateTime(dateTimeUtil.currentTimeStamp()),
                        String.valueOf(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime), error.getMessage(),
                        configUtil.readConfig("job.failed")));
                sqlQueryModel.setDataList(null);
                sqlQueryModel.setRunTime(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime);
                sqlQueryModel.setWords(null);
                if (error.getMessage().length() > 100) {
                    sqlQueryModel.setErrMsg(error.getMessage().substring(0, 100));
                } else {
                    sqlQueryModel.setErrMsg(error.getMessage());
                }
                sqlQueryModel.setJobStatus("Failed");
                // 移除已结束的连接对象
                ConnectUtil.reConnectObj(ConnectUtil.connectionMap, jobID);
                return returnResultModel.generateResult(
                        Integer.parseInt(configUtil.readConfig("return.success")),
                        configUtil.readConfig("return.msg.success"),
                        sqlQueryModel);
            }
        }
        // 对返回数据的分页操作
        int startIndex = page * pageSize - pageSize;
        int endIndex = page * pageSize;
        int flagCount = data.size();
        if (data.size() < (page * pageSize)) {
            flagCount = Math.abs((data.size() + pageSize) - (page * pageSize));
        }
        SQLQuerySubModel dataList = new SQLQuerySubModel();
        dataList.setTotal(data.size());
        List<Map<String, Object>> rows = new ArrayList<>();
        Map<String, Integer> colLenList = Maps.newHashMap();
        if (!data.isEmpty()) {
            int count = 0;
            for (int index = startIndex; index < endIndex; index++) {
                if (count == flagCount)
                    break;
                Map<String, Object> row = Maps.newHashMap();
                row.put("key", index);
                for (int i = 0; i < colCount; i++) {
                    row.put(columns.get(i), data.get(index).get(i));
                    // 计算每个字段的最大值长度
                    if (startIndex == count) {
                        colLenList.put(columns.get(i), data.get(index).get(i).length());
                    } else {
                        LOG.info("");
                        if (data.get(index).get(i).length() > colLenList.get(columns.get(i))) {
                            colLenList.put(columns.get(i), data.get(index).get(i).length());
                        }
                    }
                }
                rows.add(row);
                count += 1;
            }
            dataList.setRows(rows);
        }
        sqlQueryModel.setDataList(dataList);
        for (SQLQuerySubColModel tempCol : columnsList) {
            tempCol.setLen(colLenList.get(tempCol.getName()));
        }
        sqlQueryModel.setWords(columnsList);
        sqlQueryModel.setRunTime(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime);
        sqlQueryModel.setErrMsg("");
        sqlQueryModel.setJobStatus("Success");
        DateTimeUtil dateTimeUtil = new DateTimeUtil();
        String timeStamp = jobID.split("_")[0];
        String dateTime = dateTimeUtil.timeStampToDateTime(timeStamp).substring(0, 10);
        // 更新数据库状态
        onLineQueryMapper.updateQueryLog(queryLogTableUtil.updateQueryLog(jobID,
                configUtil.readConfig("download.file.path") + dateTime + "/" + jobID + ".csv", "",
                dateTimeUtil.timeStampToDateTime(dateTimeUtil.currentTimeStamp()),
                String.valueOf(Long.parseLong(dateTimeUtil.currentTimeStamp()) - startTime), "",
                configUtil.readConfig("job.success")));
        return returnResultModel.generateResult(Integer.parseInt(configUtil.readConfig("return.success")),
                configUtil.readConfig("return.msg.success"),
                sqlQueryModel);
    }

猜你喜欢

转载自blog.csdn.net/u012965373/article/details/84563967