要求Spark版本2.3以上,亲测2.2无效

配置

config("spark.sql.sources.partitionOverwriteMode","dynamic")

注意

1、saveAsTable方法无效,会全表覆盖写,需要用insertInto,详情见代码

2、insertInto需要主要DataFrame列的顺序要和Hive表里的顺序一致,不然会数据错误!

package com.dkl.blog.spark.hive

import org.apache.spark.sql.SparkSession

/**

  • Created by dongkelun on 2020/1/16 15:25

  • 博客:Spark 覆盖写Hive分区表,只覆盖部分对应分区

  • 要求Spark版本2.3以上

    */

    object SparkHivePartitionOverwrite {

    def main(args: Array[String]): Unit = {

    val spark = SparkSession

    .builder()

    .appName("SparkHivePartitionOverwrite")

    .master("local")

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

    .config("spark.sql.sources.partitionOverwriteMode","dynamic")

    .enableHiveSupport()

    .getOrCreate()

    import spark.sql

    val data = Array(("001", "张三", 21, "2018"), ("002", "李四", 18, "2017"))

    val df = spark.createDataFrame(data).toDF("id", "name", "age", "year")

    //创建临时表

    df.createOrReplaceTempView("temp_table")

    val tableName="test_partition"

    //切换hive的数据库

    sql("use test")

    // 1、创建分区表,并写入数据

    df.write.mode("overwrite").partitionBy("year").saveAsTable(tableName)

    spark.table(tableName).show()

    val data1 = Array(("011", "Sam", 21, "2018"))

    val df1 = spark.createDataFrame(data1).toDF("id", "name", "age", "year")

    // df1.write.mode("overwrite").partitionBy("year").saveAsTable(tableName) //不成功,全表覆盖

    // df1.write.mode("overwrite").format("Hive").partitionBy("year").saveAsTable(tableName) //不成功,全表覆盖

    df1.write.mode("overwrite").insertInto(tableName)

    spark.table(tableName).show()

    spark.stop

    }

}

结果

+---+----+---+----+

| id|name|age|year|

+---+----+---+----+

|002| 李四| 18|2017|

|001| 张三| 21|2018|

+---+----+---+----+

+---+----+---+----+

| id|name|age|year|

+---+----+---+----+

|011| Sam| 21|2018|

+---+----+---+----+

Spark 覆盖写Hive分区表,只覆盖部分对应分区的更多相关文章

  1. 解决Spark读取Hive分区表出现Input path does not exist的问题

    假设这里出错的表为test表. 现象 Hive读取正常,不会报错,Spark读取就会出现: org.apache.hadoop.mapred.InvalidInputException: Input ...

  2. Hive分区表的导入与导出

    最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏 ...

  3. spark 将dataframe数据写入Hive分区表

    从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API.Da ...

  4. Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶

    Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...

  5. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  6. Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作

    一.Hive分区表新增字段 参考博客:https://blog.csdn.net/yeweiouyang/article/details/44851459 二.Hive修改表名,列名,列注释,表注释, ...

  7. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

  8. hive 分区表

    hive中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash分区.混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说在表的数据文件中实际上并不保存分区列的信息与 ...

  9. Spark如何读写hive

    原文引自:http://blog.csdn.net/zongzhiyuan/article/details/78076842 hive数据表建立可以在hive上建立,或者使用hiveContext.s ...

  10. 【HIVE & Spark】将hive引擎换成Spark,运行速度快!怎么换?请看本文

    本教程仅仅是使用spark,能在hive用就行. 1.下载Spark; 2.WinSCP上传spark压缩包到虚拟机: 3.tar -zxvf spark-2.3.3-bin-without-hado ...

随机推荐

  1. CF1523D Love-Hate 题解

    抽象化题意: 一共有 \(m\) 个元素,给定 \(n\) 个集合,每个集合的元素不超过 \(15\) 个,求出一个元素个数最多的集合 \(S\) 是至少 \(\lceil \dfrac{n}{2} ...

  2. HelloGitHub 社区动态,开启新的篇章!

    今天这篇文章是 HelloGitHub 社区动态的第一篇文章,所以我想多说两句,聊聊为啥开启这个系列. 我是 2016 年创建的 HelloGitHub,它从最初的一份分享开源项目的月刊,现如今已经成 ...

  3. dmd-50

    按r键将其转换为字符 再将其拷贝下来 将其md5解密 得到一串英文,根据wp需要再将其加密一下,不知道为啥,得到的md5即为flag

  4. 递归与分治思想:汉诺塔(递归 && 分治思想)

    1 //64个盘子 2 //划分成小问题:1.将上面的63个盘子从x借助z移动到y上 3 2.将第64个盘子从x移动到z上 4 3.将y上的63个盘子借助x移动到z上 5 详解:https://www ...

  5. go基础-接口

    一.概述 接口是面向对象编程的重要概念,接口是对行为的抽象和概括,在主流面向对象语言Java.C++,接口和类之间有明确关系,称为"实现接口".这种关系一般会以"类派生图 ...

  6. python循环之for循环

    当我们想让列表中的元素一个一个打印出时,用多个print()就显得代码很繁琐了,这是我们就可以用到循环 list_1 = ['one', 'two', 'three', 'four', 'five'] ...

  7. 【外包杯】【报错】(表面解决实际未解决)微信小程序报错:[渲染层错误] TypeError: Cannot read property ‘$$‘ of undefined

    半解不解吧,反正实现了就行 渲染层出错,滑动图片组件无法显示,(swiper是轮播图插件,因此错误应该出现在swiper渲染中) 可以这样移动,但是没有图片 我觉得是路径的问题 兄弟们,目前没有解决接 ...

  8. Mysql数据库插入数据时出现Unknown column ‘admin‘ in ‘field list‘错误

    报错内容 报错原因 字段和插入的值所用的引号不对 解决方案 insert into t_user(`username`,`password`,`email`) VALUES(`admin`,`admi ...

  9. classpath 和 classpath* 的区别

    classpath 和 classpath* 的区别 classpath 和 classpath* 是两种不同的类路径搜索模式,它们在寻找资源文件时有所不同: classpath:classpath ...

  10. Logistics Regression (对数几率回归)及numpy实现

    Logistics Regression 我们知道线性回归模型可以处理回归问题,但是如何处理分类问题? 对于一个二分类问题,或许我们可以认为w*x+b > 0为正类,其他情况为负类. 那么模型不 ...