Python连接Hive
一、前提准备
Python版本:3.6.4;
需要下载的包:
打开cmd在命令提示窗口中运行:
pip install sasl
pip install thrift
pip install thrift-sasl
pip install PyHive
这里大家在安装sasl的时候,如果报错的话,可以进入官网下载,我在这里下载的是
sasl‑0.2.1‑cp35‑cp35m‑win_amd64.whl
,大家根据需要自行下载。
下载完成后,即可打开Python界面:
jupyter notebook
二、代码连接
首先需要开启hiveserver2:
hive --service hiveserver2
2.1、初体验
首先需要导入包pyhive
#导入包
from pyhive import hive
#建立与hive建立连接:主机ip、端口号、主机名、库名
coon = hive.Connection(host='192.168.136.10',port=10000,username='hadoop01',database='test')
test1 = coon.cursor()
#需要执行的sql语句
test1.execute("select * from code_name")
#获取结果
for result in test1.fetchall():
print(result)
这里为了方面,我们可以把它封装为一个方法,同时,转换为DataFrame的形式输出。
2.2、转换为DataFrame形式
import pandas as pd
#定义一个方法:
def python_To_Hive(sql):
connection = hive.Connection(host='192.168.136.10',port=10000,username='hadoop01',database='test')
cur = connection.cursor()
cur.execute(sql)
#description输出表格信息组成的列表,每一个信息组成一个元组
columns = [col[0] for col in cur.description]
#获取数据,组成字典
result = [dict(zip(columns, row)) for row in cur.fetchall()]
df = pd.DataFrame(result)
df.columns = columns
return df
sql = "select * from code_name"
df = python_To_Hive(sql)
2.3、简单计算:求空值率
df.apply(lambda x : x.isnull().sum()/len(x),axis=0)
Java连接Oracle
一、前提准备
上传Oracle驱动包。我这里使用的是ojdbc6.jar
二、代码实现
2.1、测试连接
设置Oracle的url有两种方式:
jdbc:oracle:thin:@host:port:SID
jdbc:oracle:thin:@//host:port/service_name
。
这里我采用的是第一种方式。Oracle默认的SID的orcl。
package Connect;
import java.sql.*;
/**
* @Author
* @Date 2021/9/19
* @Description
*/
public class ConnectToOracle {
//1、设置属性
Connection conn = null;
Statement stmt = null;
String url = null;
String username = null;
String password = null;
//2、定义连接方法
public String connect(String url, String username, String password) {
try {
//加载驱动
Class.forName("oracle.jdbc.OracleDriver");
//连接
conn = DriverManager.getConnection(url, username, password);
if (conn != null) {
System.out.println("Oracle连接成功");
}else {
System.out.println("Oracle连接失败");
}
assert conn != null;
stmt = conn.createStatement();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
return "";
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试运行:
public class Test {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.136.10:1521:orcl";
String username = "system";
String password = "admin";
ConnectToOracle coon = new ConnectToOracle();
String res = coon.connect(url, username, password);
System.out.println(res);
}
}
2.2、操作Oracle
现在oracle里有三张表student
、teacher
、school
school
是张空表
下面我们按照各表id统计数量。没有id的统计总数。
当我们的表数量较多时,可以采用读取文件的方式,加载各表。
我这里把表名和字段名存储到table.txt
文件中。
代码实现:
package Connect;
import java.io.*;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @Author
* @Date 2021/9/19
* @Description
*/
public class JavaOracle {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.136.10:1521:orcl";
String username = "system";
String password = "admin";
BufferedReader buffer = null;
BufferedWriter out = null;
ResultSet rs = null;
//1、连接数据库
ConnectToOracle coon = new ConnectToOracle();
String res = coon.connect(url, username, password);
System.out.println(res);
try {
//2、读取文件
File file = new File("Data/table.txt");
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
buffer = new BufferedReader(read);
//3、写入文件
out = new BufferedWriter(new FileWriter("Data/result.txt"));
String sql = null;
String lineText = null;
//4、按行读取文件,并把每行拆分成一个数组。
while ((lineText = buffer.readLine()) != null) {
String[] table_date = lineText.trim().split(",");
//5、判断各表
if (table_date.length == 2 && table_date[0].toString().equals("student")) {
sql = "select count(1) as cnt from " + table_date[0] + " where " + table_date[1] + " >1";
System.out.println(sql);
} else if (table_date.length == 2 && table_date[0].toString().equals("teacher")) {
sql = "select count(1) as cnt from " + table_date[0] + " where " + table_date[1] + " >101";
System.out.println(sql);
} else if (table_date.length == 1) {
sql = "select count(1) as cnt from " + table_date[0];
System.out.println(sql);
}
try {
rs = coon.stmt.executeQuery(sql);
while (rs.next()) {
if (rs.getInt("cnt") == 0) {
out.write(table_date[0] + " 表中没有数据\n");
} else {
out.write(table_date[0] + " 的数据量为:" + rs.getInt("cnt")+"\n");
}
}
} catch (SQLException s) {
//当某张表的SQL发生异常时,我们可以捕获并写入到文件中去。
out.write(table_date[0] + " 表没有找到\n");
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭文件
buffer.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行后我们可以在文档中查看结果: