package com.anna.hive.util;
import java.sql.*;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
/**
* 1. 數據倉庫連接
* 2. 數據庫列表預覽
* 3. 數據表列表預覽
* 4. 數據表結構預覽
* 5. 樣例數據預覽(抽樣)
* 6. 切換數據庫
* */
public class HiveUtil {
private Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Statement statement = null;
static {
try{
//1、加載驅動
Class.forName("org.apache.hive.jdbc.HiveDriver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
//構造方法:打開一個連接
public HiveUtil(){
try{
//1、數據倉庫連接
conn = DriverManager.getConnection("jdbc:hive2://master:10010","anna","");
statement = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 2. 數據庫列表預覽
* @return 返回數據庫名稱集合
* 語句:show databases
*/
public List<String> getDatabases(){
List result = new ArrayList<String>();
//執行查詢
try {
preparedStatement = conn.prepareStatement("show databases");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
result.add(resultSet.getString(1));
}
return result;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* 3、數據庫列表預覽
* show tables
* @param database 要獲取哪個數據庫中的表
* @return 返回的是數據表的集合
* 語句:show {database}.{table}
* */
public List<String> getTables(String database){
List result = new ArrayList<String>();
//執行查詢
try {
//切換數據庫
changeDatabase(database);
resultSet = statement.executeQuery("show tables");
while (resultSet.next()) {
result.add(resultSet.getString(1));
}
return result;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* 4、 數據表結構預覽
* @param database 數據庫名稱
* @param table 數據表名稱
* @return 返回的是表的描述性息的集合
* 語句:desc {database}.{table}
* */
//需要參數:數據庫名,表名
public List<String> getTableDesc(String database,String table){
List<String> result = new ArrayList<>();
try{
//創建preparedStatement
preparedStatement = conn.prepareStatement("desc " + database + "." + table);
//執行查詢操作
ResultSet resultSet = preparedStatement.executeQuery();
//將結果封裝到list中
while (resultSet.next()) {
result.add(resultSet.getString(1) + " " + resultSet.getString(2));
}
return result;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 5. 樣例數據預覽(抽樣)——>limit實現
* @param database 數據庫名稱
* @param table 數據表名稱
* @param n 獲取前n行記錄
* 語句:select * from {database}.{table} limit {number}
* */
public List<String> getDataByLimit(String database, String table, int n) {
int columns = getTableDesc(database, table).size();
List<String> list = new ArrayList<>();
try {
preparedStatement = conn.prepareStatement("select * from " + database + "." + table + " limit " + n);
resultSet = preparedStatement.executeQuery();
return getData(resultSet, columns);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 5. 樣例數據預覽(抽樣)——> tablesample實現
* @param database 數據庫名稱
* @param table 數據表
* @param percent 抽樣比例
* 語句: select * from {database}.{table} tablesample({percent} percent)
* */
public List<String> getDataBySample(String database, String table, double percent) {
int columns = getTableDesc(database, table).size();
List<String> list = new ArrayList<>();
try {
preparedStatement = conn.prepareStatement("select * from " + database + "." + table + " tablesample(" + percent + " percent)");
resultSet = preparedStatement.executeQuery();
return getData(resultSet, columns);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 5. 樣例數據預覽(抽樣)——> rand實現
* @param database 數據庫名稱
* @param table 數據表
* @param n 隨機取出前n行記錄
* 語句:select *,rand()r from {database}.{table} order by r limit n
* */
public List<String> getDataByRandom(String database, String table, int n) {
int columns = getTableDesc(database, table).size();
List<String> list = new ArrayList<>();
try {
preparedStatement = conn.prepareStatement("select *,rand() r from " + database + "." + table + " order by r limit " + n);
resultSet = preparedStatement.executeQuery();
return getData(resultSet, columns - 1);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 數據封裝工具
* @param resultSet 結果集
* @param size 數據列數量,也就是要獲取幾列的數據
* @return 封裝的List數據集
*/
private List<String> getData(ResultSet resultSet,int size){
try {
List<String> list = new ArrayList<>();
while (resultSet.next()) {
String line = "";
for (int i = 0; i < size; i++) {
line += resultSet.getString(i + 1) + "\t";
}
line = line.substring(0, line.length() - 1); //左閉右開
//將每一條記錄添加到lisi中
list.add(line);
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 通過自定義的SQL返回結果
* @param sql 要執行的sql語句——包含數據庫名稱
* @return 執行SQL的結果集
*
* 前期準備:hive中存在數據庫temp,用于存放臨時SQL去查詢的中間表
* ① 將查詢到的結果集生成中間表存放到temp數據庫下 create table {table} as sql
* ② 再通過查詢此中間表返回結果集合
* ③ 表名隨機:tmp_userId_時間戳
* */
public List<String> getDataBySQL(String sql) {
//將表名進行隨機:tmp_userId_時間戳
//時間戳——> long ——> 1970-01-01 00:00:00 ——> Unix元年
try {
String tableName = "temp_1_" + new Date().getTime();
preparedStatement = conn.prepareStatement("create table temp." + tableName + " as " + sql);
preparedStatement.execute();
//獲取表的字段個數
int size = getTableDesc("temp",tableName).size();
preparedStatement = conn.prepareStatement("select * from temp." + tableName);
ResultSet resultSet = preparedStatement.executeQuery();
return getData(resultSet, size);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 從數據表中查詢指定列的數據
* @param sql 要執行的sql語句——>包含數據庫名稱
* @param columnsIndex 待查詢的列的索引
* @return SQL執行的結果集
* */
public List<String> getDataBySQLWithColumns(String sql,int[] columnsIndex){
try{
String tableName = "tmp_1_" + new Date().getTime();
preparedStatement = conn.prepareStatement("create table temp." + tableName + " as " + sql);
resultSet = preparedStatement.executeQuery();
return getDataByColumns(resultSet, columnsIndex);
}catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* @param resultSet 查詢結果集
* @param columnIndex 數據列索引
* @return 封裝的List數據集
* */
private List<String> getDataByColumns(ResultSet resultSet, int[] columnIndex) {
List<String> list = new ArrayList<>();
try{
while (resultSet.next()) {
String line = "";
for (int i = 0;i < columnIndex.length;i++) {
line += resultSet.getString(columnIndex[i]) + ",";
}
line = line.substring(0,line.length() - 1);
list.add(line);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* 執行查詢語句,返回結果
* @param sql 需要執行的sql語句
* @param paras 執行查詢時所需要的參數
* @return 結果集
* */
public ResultSet executeQuery(String sql,Object[] paras){
try {
preparedStatement = conn.prepareStatement(sql);
getPreparedStatement(paras);
return preparedStatement.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
/**
* 將傳入的參數進行賦值,構建一個完整的PreparedStatement
* @param paras 傳入的參數
*/
private void getPreparedStatement(Object[] paras) {
try {
if (paras != null) {
for (int i = 0; i < paras.length; i++) {
preparedStatement.setObject(i + 1, paras[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 執行一個不需要返回結果的命令
* @param sql 需要執行的sql
* @param paras 執行sql需要的參數
*/
public void execute(String sql, Object[] paras){
try {
preparedStatement = conn.prepareStatement(sql);
getPreparedStatement(paras);
preparedStatement.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 6、切換數據庫
* @param database 數據庫名稱
* 語句:use {database}
* */
public void changeDatabase(String database) {
try {
statement.execute("use " + database);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 釋放資源
*/
public void close() {
try {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null){
preparedStatement.close();
}
if (conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
HiveUtil
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...