Spark连接MySQL数据库并读取数据

(作者:陈玓玏)

打开pyspark,带驱动的那种

用命令行启动pyspark时需要加上jdbc的驱动路径:

pyspark --driver-class-path D:/Users/chendile/Downloads/mysql-connector-java-3.1.14.jar

在Linux和Windows命令行下都可以用这种方法,但是如果出现以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o58.load.
: java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required

说明是数据库驱动的版本不对,改成一样的版本就可以了,一般是数据库版本低而java版本高造成的,先在任务管理器中找到自己的mysql服务,找到其对应的版本信息,然后查找对应的mysql-connector-java版本,比如我的mysql是5.1版本的,而我的mysql-connector-java是8.0的,然后我下载了一个3.1版的,就连接成功了。

驱动下载地址:https://blog.csdn.net/qiangqiang816/article/details/81541090
mysql和mysql-connector-java版本的对应:https://www.cnblogs.com/junzi/p/6893122.html

从mysql读取数据为DataFrame

#通过sparksession可以把各种来源的数据读取为DataFrame格式,并在其上使用sql语言
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext

#创建session,在appName之前还可以配置.master("local"),master指定spark集群的master,设置为local时表示集群在本地,local[4]表示在本地开四个线程跑集群,设置为“spark://master:7077”,也就是一个集群的master的ip地址,表示是在多台机器上跑集群,appName是你为spark应用取的名字,可以通过这个名字调用的,config是配置应用,不知道怎么配置的话可以直接在config括号中填入conf=SparkConf()),使用默认配置。build类还有enableHiveSupport属性,可以开启hive支持。
sc = SparkSession.builder.appName("python_deal_dat").config('spark.some.config,option0','some-value').getOrCreate()

#这句话加不加都能读mysql的数据,用sc.read和ctx.read是一样的结果,但是这句话加了可以解决sparksession的一个大坑,那就是sparksession没有序列化器的问题,没有序列化器很多数据操作没法用,比如foreach,会报错:AttributeError: 'SparkSession' object has no attribute 'serializer',所以最好是用SQLContext(这个问题还是没解决的)
ctx = SQLContext(sc)

#读取mysql数据是通过Java的jdbc读取的,url表示数据库地址,从127那里开始要改成你自己的地址,driver必须加,不加会报未指定驱动的错误,
df=ctx.read.format("jdbc").options(url="jdbc:mysql://127.0.0.1:3306/test", driver="com.mysql.jdbc.Driver", dbtable="(SELECT * FROM cdl_var_credit02_loss) tmp",user="root", password="********").load()

#通过printSchema获取其列名和每列对应的类型及空值限制
print(df.printSchema())

java.lang.RuntimeException:The root scratch dir:/tmp/hive on HDFS should be writable.错误

我在win8下读取mysql数据库中的内容时遇到了这个问题,其实这个问题的产生和我的代码没什么关系,但它的确影响到了我现在的进度,最后找到的解决方法很简单粗暴,直接在命令行中跳转到spark的bin文件夹,然后输入以下命令:

hadoop fs -rm -r /tmp/hive
rm -rf /tmp/hive  #这个应该是Linux系统下的

然后再读取数据库的内容就没有问题了!

参考资料:
1、 https://blog.csdn.net/zgjdzwhy/article/details/71056801
2、 https://blog.csdn.net/bhcgdh/article/details/80731516
3、 https://blog.csdn.net/zlpzlr/article/details/79012140

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值