达梦DM8数据库—数据中台系统学习开发记录(四)
项目模块遇到的问题(1)
一、数据库字段类型自动变更
- 使用IDEA写入达梦数据库中,创建表时结构为varchar(255)类型,代码执行后自动莫名其妙更改为了TEXT的长文本类型。
在写项目代码时,为了测试连接本地与大数据平台上的达梦数据库达到读写数据表的效果,使用了外部包DmJdbcDriver18
譬如,经过dataframe的一系列算子操作后,得到一个最终的dataframe可以写到数据库中,名字叫做resultEnd
在数据库中有一个创建好的表 —> Test表
其中的字段为 “客户名称” —> varchar 类型
“提单号” —> varchar类型
如下图:
在执行下面的代码后再浏览数据库的Test表会
自动将VARCHAR类型修改完TEXT长文本类型,非常的莫名其妙
End.write.mode(SaveMode.Overwrite)
.option("url",url)
.option("dbtable", "Test")
.option("driver", "dm.jdbc.driver.DmDriver")
.option("isolationLevel", "READ_COMMITTED")
.jdbc(url, "Test", connectionProperties)
最终写到数据库是这样的:
因此在经过多次尝试后,我采取的解决办法是 将SaveMode中的Overwrite修改为Append,就会解决这个问题,能够正常的将数据写入到数据库中。
二、SaveMode的类型区别
1.Overwrite
- 特点1: 这种类型是“重写”数据,由于数据库的字段设置限制会将类型自动转换成TEXT长文本类型,无法在数据库中正常显示。
- 特点2: 使用Overwrite时无需在数据库中事先创建一个表,直接执行后,在达梦数据库中可以自动创建对应结构的表。
2.Append
- 特点1: 这种类型是“追加”,会将数据正常写入数据库中,而不出现类型自动转换
- 特点2:: 使用Append时因为是“追加数据”,使用前需要在数据库中实现创建好对应结构的空表,再写入数据库。如果执行出错需要重新写入,则需要使用
truncate table 表名的sql语句先清空数据库的表,再使用Append写入。
三、扩展(达梦数据库的读取与写入)
1.基础信息配置
要先加入DmJdbcDriver18的jar包
在代码中写入一下信息,以便后期统一管理
//从达梦数据库中获取数据
//JDBC连接达梦数据库配置,定义 JDBC 连接属性
val connectionProperties = new Properties()
connectionProperties.setProperty("user", "DAMENG")
connectionProperties.setProperty("password", "DAMENG1234")
//达梦数据库内部访问
//val url = "jdbc:dm://dm-discovery.cnsof55014495-system.svc:5236/DAMENG"
//达梦数据库外部访问
val url = "jdbc:dm://36.140.31.145:31958/DAMENG"
//设置日志输出等级,减少打印的日志信息
val logger = Logger.getLogger("org")
logger.setLevel(Level.ERROR)
2.读取
//读取 HDFS_LOAD 装货表
val HDFS_LOAD:DataFrame = spark.read.format("JDBC")
.option("header","true")
.option("url", url)
.option("driver", "dm.jdbc.driver.DmDriver")
.option("user", "DAMENG")
.option("password", "DAMENG1234")
.option("dbtable", "O_HDFS_LOAD")
.option("charset", "gbk")
.load()
//创建视图
HDFS_LOAD.createOrReplaceTempView("HDFS_LOAD")
// SQL语句查询全部数据
val res1 = spark.sql("SELECT * FROM HDFS_LOAD")
3.写入
InRating2.write.mode(SaveMode.Append)
.option("url",url)
.option("dbtable", "不同货物吞量占比")
.option("driver", "dm.jdbc.driver.DmDriver")
.option("isolationLevel", "READ_COMMITTED")
.jdbc(url, "不同货物吞量占比", connectionProperties)
三种操作能够完美地完成对达梦数据库中数据的读取和写入。
四、存在的问题
- 由于数据源来源多样,要读取多个表,读取的代码存在多项重复,导致不可复用,一旦数据库的账号密码等修改,就需要逐个修改,比较麻烦 。而写入时的代码使用了变量存储了url和账户密码等信息,较为好用。