前期准备

(写在前面,以下配置信息均是linux服务器操作配置。)

python连接时需要安装oracle客户端文件,pip安装cx_Oracle。
pyspark需要配置jdbc信息。

1.安装客户端

以下两个安装命令,需要获取服务器的root权限或sudo权限
rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm (1)
rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm (2)

如果安装未出现问题,则安装后,还需配置环境变量,输入 vim /etc/profile
进入环境变量配置页面,输入i,插入如下环境变量:

export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$PATH:$ORACLE_HOME/bin     
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib

最后按入Esc ,输入:wq!保存退出vim,然后运行 source /etc/profile 使配置生效。

2.安装cx_Oracle

用清华镜像直接进行pip安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple

或者可以在pypi网站下载对应python版本的cx_Oracle进行安装。

一、python

1.python连接oracle

import cx_Oracle
import pandas as pd
def sql_data_load(sql):
    connection = cx_Oracle.connect('username','password',
                                   '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.xxx.xx)(PORT=1521))\
                                   (CONNECT_DATA=(SID=epmisdb2)))')
    data = pd.read_sql(sql,connection)
    connection.close()
    return data

sql_data_load函数中,输入是sql语句,输出是数据表。第一步是配置cx_Oracle.connect,其中包括数据库的用户名、密码、端口信息等(请不要直接操作,修改自己目标数据库的对应信息)。第二步是使用pandas 中的read_sql函数来获得制定sql的数据信息。connection.close()是关闭连接通道。
小栗子:

student_sql = " select * from student where user_name == '张三‘ ”

data = sql_data_load(student_sql)
OK!此时data就是student表中张三的信息来。

2.python连接hive

网上有很多配置pyhive/impala的方法,此处略过。下面是使用impala方法连接hive.

from impala.dbapi import connect
def hive_data_load(sql):
    conn = connect(host='192.168.xxx.xxx', port=10000, user='hdfs', password=None, database='xxxx', auth_mechanism="NOSASL")
    data = pd.read_sql(sql,conn)
    conn.close()
    return data

函数hive_data_load输入是操作sql,输出是数据表。connect中的参数主要有hive的服务器路径信息,port,user,password可以按照上面的进行配置,database配置hive中的数据库名字。
函数运行同上面的小栗子。

二、pyspark

1.pyspark连接oracle

这个方法需要配置jdbc文件,将jdbc配置在环境变量中

d_meter = spark.read.format('jdbc').option('url','jdbc:oracle:thin:@172.16.xxx.xxx:1521:xxxxxx').option('dbtable','dstudent').option('user','aaa').option('password','Onetwo').load()

该方法主要用的是pyspark.sql 中的pyspark.sql.DataFrameReader(spark)部分,选择“jdbc"方式,配置数据库url及登陆信息。
ps:我在用这个方法直接load整张表,然后用sparksql进行数据操作,数据表大的话非常的慢!如果你有好的方法还请帮帮忙,抱拳。

2.pyspark连接hive

from pyspark.sql import SparkSession,functions,HiveContext
spark = SparkSession.builder.master("yarn-client").appName("test").getOrCreate()
hive_context= HiveContext(spark)
#读
c_meter = hive_context.sql("select * from eic.c_meter")
c_meter.show()
#写
c_meter.write.format("hive").mode("overwrite").saveAsTable('eic.table_name')
#eic是表空间,c_meter,table_name是读写的表名

这个方法操作简单,且能执行sql筛选目标数据。在向hive中写数据的时候,hive中需提前定义表名和字段信息。