首页 文章 精选 留言 我的

精选列表

搜索[修改],共10000篇文章
优秀的个人博客,低调大师

Spark通过修改DataFrame的schema给表字段添加注释

版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/82347513 我的原创地址:https://dongkelun.com/2018/08/20/sparkDfAddComments/ 1、需求背景 通过Spark将关系型数据库(以Oracle为例)的表同步的Hive表,要求用Spark建表,有字段注释的也要加上注释。Spark建表,有两种方法: * 用Spark Sql,在程序里组建表语句,然后用Spark.sql(“建表语句”)建表,这种方法麻烦的地方在于你要读取Oracle表的详细的表结构信息,且要进行Oracle和Hive的字段类型进行一一对应 * 用DataFrame 的saveAsTable方法,这种方法如果对应的数据库里没有表,则Spark会根据DataFrame的schema自动建表,比较简单,不用考虑字段类型匹配转化问题,但是这种方法有一个问题,Spark读取Oracle的表为DataFrame时,并不能将表字段的注释读进来,所以就有了如标题所示的需求。(一开始以为DataFrame不能加注释,经过研究,发现是可以的!) 2、如何查看DataFrame是否有注释 前面讲到DataFrame里没有Oracle的注释信息,但是如果数据源为Hive的话,是可以将注释获取到的。 2.1 新建Hive测试表(带注释) create table `test` ( `id` string comment 'ID', `Name` string comment '名字' ) comment '测试'; 2.2 Spark读取hive表并打印注释(在spark-shell里执行) 若不清楚Spark如何连接hive,可以参考:spark连接hive(spark-shell和eclipse两种方式) 首先看一下df.printSchema里并没有注释信息 sql("use test") val df = spark.table("test") df.printSchema root |-- id: string (nullable = true) |-- name: string (nullable = true) 用下面这行代码便可以打印注释信息: df.schema.foreach(s=>println(s.name,s.metadata)) (id,{"comment":"ID","HIVE_TYPE_STRING":"string"}) (name,{"comment":"名字","HIVE_TYPE_STRING":"string"}) 3、读取Oracle表并打印DataFrmae的元数据信息 3.1 新建Oracle测试表(带注释) CREATE TABLE ORA_TEST ( ID VARCHAR2(100), NAME VARCHAR2(100) ); COMMENT ON COLUMN ORA_TEST.ID IS 'ID'; COMMENT ON COLUMN ORA_TEST.NAME IS '名字'; COMMENT ON TABLE ORA_TEST IS '测试'; 注:上面的注释语句和建表语句需要分开执行,或者也可以在数据库工具执行脚本,比如我用的DBeaver用快捷键Alt+x即可。当然也可以在工具的界面直接建表均可。 3.2 读取Oracle表,并打印元数据 代码: package com.dkl.leanring.spark.sql.Oracle import org.apache.spark.sql.SparkSession object OracleSchemaDemo { def main(args: Array[String]): Unit = { val spark = SparkSession.builder().appName("OracleSchemaDemo").master("local").getOrCreate() val df = spark.read .format("jdbc") .option("url", "jdbc:oracle:thin:@192.168.44.128:1521:orcl") .option("dbtable", "ORA_TEST") .option("user", "bigdata") .option("password", "bigdata") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() df.schema.foreach(s => println(s.name, s.metadata)) spark.stop } } (ID,{"name":"ID","scale":0}) (NAME,{"name":"NAME","scale":0}) 注:Spark2.3.0和Spark2.2.1的元数据不太一样,上面的结果是Spark2.2.1(也是我写博客测试用的),项目中用的Spark2.3.0,2.3.0的元数据是空的,如下 (ID,{}) (NAME,{}) 可见并没有注释信息 3.3 给DataFrame添加注释 import org.apache.spark.sql.types._ val commentMap = Map("ID" -> "ID", "NAME" -> "名字") val schema = df.schema.map(s => { s.withComment(commentMap(s.name)) }) //根据添加了注释的schema,新建DataFrame val new_df = spark.createDataFrame(df.rdd, StructType(schema)).repartition(160) new_df.schema.foreach(s => println(s.name, s.metadata)) (ID,{"comment":"ID","name":"ID","scale":0}) (NAME,{"comment":"名字","name":"NAME","scale":0}) 4、 测试写到Hive表有没有注释 需将前面代码中的spark改为支持hive,即加上enableHiveSupport() spark.sql("use test") new_df.write.mode("overwrite").saveAsTable("ORA_TEST") 然后在hive里看一下,是否有注释 可以看到,成功的把注释也保存到里hive里 5、附录 附上在Eclipse运行的完整代码 package com.dkl.leanring.spark.sql.Oracle import org.apache.spark.sql.SparkSession import org.apache.spark.sql.types._ object OracleSchemaDemo { def main(args: Array[String]): Unit = { val spark = SparkSession.builder().appName("OracleSchemaDemo").master("local").enableHiveSupport().getOrCreate() val df = spark.read .format("jdbc") .option("url", "jdbc:oracle:thin:@192.168.44.128:1521:orcl") .option("dbtable", "ORA_TEST") .option("user", "bigdata") .option("password", "bigdata") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() df.schema.foreach(s => println(s.name, s.metadata)) val commentMap = Map("ID" -> "ID", "NAME" -> "名字") val schema = df.schema.map(s => { s.withComment(commentMap(s.name)) }) //根据添加了注释的schema,新建DataFrame val new_df = spark.createDataFrame(df.rdd, StructType(schema)).repartition(160) new_df.schema.foreach(s => println(s.name, s.metadata)) spark.sql("use test") //保存到hive new_df.write.mode("overwrite").saveAsTable("ORA_TEST") spark.stop } }

优秀的个人博客,低调大师

把默认的CentOS yum源修改成国内的163源

163官方教程:http://mirrors.163.com/.help/centos.html 1.安装Centos后默认的yum源如下 [root@kangvcar ~]# ll /etc/yum.repos.d/ total 32 -rw-r--r--. 1 root root 1664 Dec 9 2015 CentOS-Base.repo -rw-r--r--. 1 root root 1309 Dec 9 2015 CentOS-CR.repo -rw-r--r--. 1 root root 649 Dec 9 2015 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 290 Dec 9 2015 CentOS-fasttrack.repo -rw-r--r--. 1 root root 630 Dec 9 2015 CentOS-Media.repo -rw-r--r--. 1 root root 1331 Dec 9 2015 CentOS-Sources.repo -rw-r--r--. 1 root root 1952 Dec 9 2015 CentOS-Vault.repo 2.把默认yum源备份(可选) [root@kangvcar ~]# mkdir /opt/centos-yum.bak [root@kangvcar ~]# mv /etc/yum.repos.d/* /opt/centos-yum.bak/ 3.下载163 yum源repo文件 #各系统版本repo文件对应的下载操作 CentOS 5 wget -O /etc/yum.repos.d/CentOS5-Base-163.repo http://mirrors.163.com/.help/CentOS5-Base-163.repo CentOS 6 wget -O /etc/yum.repos.d/CentOS6-Base-163.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo CentOS 7 wget -O /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo [root@kangvcar ~]# cat /etc/redhat-release //查看系统的版本 CentOS Linux release 7.2.1511 (Core) [root@kangvcar ~]# wget -O /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo --2017-06-20 06:29:47-- http://mirrors.163.com/.help/CentOS7-Base-163.repo Resolving mirrors.163.com (mirrors.163.com)... 123.58.173.185, 123.58.173.186 Connecting to mirrors.163.com (mirrors.163.com)|123.58.173.185|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1572 (1.5K) [application/octet-stream] Saving to: ‘/etc/yum.repos.d/CentOS7-Base-163.repo’ 100%[=======================================================================================================>] 1,572 --.-K/s in 0s 2017-06-20 06:29:47 (293 MB/s) - ‘/etc/yum.repos.d/CentOS7-Base-163.repo’ saved [1572/1572] 4.清除缓存 [root@kangvcar ~]# yum clean all Loaded plugins: fastestmirror Cleaning repos: base extras updates Cleaning up everything Cleaning up list of fastest mirrors [root@kangvcar ~]# yum makecache //把yum源缓存到本地,加快软件的搜索好安装速度 [root@kangvcar ~]# yum list //总共列出了9951个包

优秀的个人博客,低调大师

iOS7修改UISearchBar的Cancel按钮的颜色和文字

两行代码搞定: [[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor whiteColor]]; [[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTitle:@"取消"]; 查了很多,试了很多。唯一work的东东。就是这两行代码。 enjoy 欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处! 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/4185304.html ,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册