博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spark:saveAsTable解析
阅读量:6921 次
发布时间:2019-06-27

本文共 3815 字,大约阅读时间需要 12 分钟。

说一下默认的配置saveAsTable方法会以parquet文件的形式存储数据,但是由于spark和hive使用的parquet标准不一致(对decimal类型存储的时候,具体和精度有关如DecimalType(10,2)会报错而DecimalType(38,18)并不会报错)。

所以如果DataFrame里有DecimalType类型,会出现用spark存的表spark可以读取,hive客户端读取报错的问题。在spark中可以通过配置来更改spark使用的parquet存储标准(但是hive不能配置),所以在用spark saveAsTable时最好都加上此配置:

.config("spark.sql.parquet.writeLegacyFormat", true)

saveAsTable会利用hive API将Dataset持久化为表,其中表的元数据默认用derby存了一个数据库中,表的数据会存在spark.sql.warehouse.dir变量的文件夹下。

元数据的存储默认用derby数据库。

使用derby数据库:

#下载wget -O ../db-derby-10.12.1.1-bin.tar.gz#解压tar -zxf db-derby-10.12.1.1-bin.tar.gz -C derby#配置环境变量export DERBY_HOME=/root/derbyexport PATH=$PATH:$DERBY_HOME/binexport CLASSPATH=$CLASSPATH:$DERBY_HOME/lib#启动交互模式ij#指定默认协议ij> PROTOCOL 'jdbc:derby:';#连接数据库,ij> connect '/root/dir/metastore_db';#若没指定默认协议,则用:ij> connect 'jdbc:derby:/root/dir/metastore_db';#若不存在数据库则创建用:ij> connect 'jdbc:derby:/root/dir/metastore_db;create=true';#显示表ij> show tables;#执行语句ij> select * from table_a;#退出ij> exit;

若用java连接,需在classpath里加入jar包,为上面解压后的derby/lib/derby.jar(此版本为3.1MB):

import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.SQLWarning;import java.sql.DatabaseMetaData; public class Main {
private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver" ; private static final String url = "jdbc:derby:test;create=true" ; static void printSQLException(SQLException se) {
while(se != null) {
System.out.print("SQLException: State: " + se.getSQLState()); System.out.println("Severity: " + se.getErrorCode()); System.out.println(se.getMessage()); se = se.getNextException(); } } static void printSQLWarning(SQLWarning sw) {
while(sw != null) {
System.out.print("SQLWarning: State=" + sw.getSQLState()) ; System.out.println(", Severity = " + sw.getErrorCode()) ; System.out.println(sw.getMessage()); sw = sw.getNextWarning(); } } public static void main(String[] args) {
Connection con = null ; DatabaseMetaData dbmd = null ; try {
Class.forName(driver) ; con = DriverManager.getConnection(url); SQLWarning swarn = con. getWarnings() ; if(swarn != null){
printSQLWarning(swarn) ; } dbmd = con.getMetaData() ; System.out.println("\n----------------------------------------------------") ; System.out.println("Database Name = " + dbmd.getDatabaseProductName()) ; System.out.println("Database Version = " + dbmd.getDatabaseProductVersion()) ; System.out.println("Driver Name = " + dbmd.getDriverName()) ; System.out.println("Driver Version = " + dbmd.getDriverVersion()) ; System.out.println("Database URL = " + dbmd.getURL()) ; System.out.println("----------------------------------------------------") ; } catch (SQLException se) {
printSQLException(se) ; } catch(ClassNotFoundException e){
System.out.println("JDBC Driver " + driver + " not found in CLASSPATH") ; } finally {
if(con != null){
try{
con.close() ; } catch(SQLException se){
printSQLException(se) ; } } } }}

通过derby可以查看hive元数据表,如下:

ij> select * from DBS;ij> select * from SEQUENCE_TABLE;ij> select * from SERDES;ij> select * from SERDE_PARAMS;ij> select * from TABLE_PARAMS;ij> select * from VERSION;

转载于:https://www.cnblogs.com/xuejianbest/p/10284992.html

你可能感兴趣的文章
关键业务系统的JVM启动参数推荐 2.0版
查看>>
制作U盘安装Ubuntu系统
查看>>
Java基础学习3(类型转换:自动类型转换 和 强制类型转换,字符串String)
查看>>
大道至简——RISC-V架构之魂(转载)
查看>>
测试基础
查看>>
springcloud学习服务网关zuul-初步学习
查看>>
VS 中 ExtJS 智能提示
查看>>
陈松松:视频营销效果不好,从这四个角度找原因
查看>>
Python代码调试技巧
查看>>
Nginx优化指南
查看>>
elasticsearch集群搭建手册
查看>>
如何正确认识XMind软件格式
查看>>
OSChina 周一乱弹 ——有2个小混蛋大晚上……
查看>>
JNI/NDK开发指南(二)——JVM查找java native方法的规则
查看>>
Installing / Updating Python on OS X
查看>>
Android解析XML文件
查看>>
Spring AOP前置通知和后置通知
查看>>
Windows 之间用rsync同步数据(cwRsyncServer配置)
查看>>
android gps定位
查看>>
JFinal AOP学习笔记
查看>>