Delta Lake 分区表覆盖写入操作

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
EMR Serverless Spark 免费试用,1000 CU*H 有效期3个月
简介: Delta Lake当前版本(0.5)只支持API操作的,但是实现 Insert SQL 语法也不难,需要注意的是 Delta Lake 中的分区表覆盖写入操作。

01 覆盖写

INSERT OVERWRITE TABLE 分区表时分三种场景:

  • 动态分区 - 写入前会删除所有分区,并根据数据中的分区字段写入相应新分区
  • 静态分区 - 只会对指定的分区进行覆盖写操作
  • 混合分区(动态+静态分区) - 上述两种情况的结合

如果想通过 SQL 转化为上述 API ,首先需要在 sql parser 的时候获取到 insertMode 和 partitions 信息,并将 partitions 信息存在一个有序的结构中,例如 LinkedHashMap。然后利用这些信息,就可以拼装进行拼装实现上述三种场景。

1.1 动态分区

对所有 ds 分区进行覆盖写操作,将会清空所有 ds 分区

sql

INSERT OVERWRITE TABLE db.tableA partition(ds) 
  select name,ds from db.tableB

Delta Lake API

df.write.format("delta").mode("overwrite").partitionBy(ds)

1.2 静态分区

对 ds=20200101 的分区进行覆盖写操作,Delta 不能直接将数据写入分区目录

sql

INSERT OVERWRITE TABLE db.tableA partition(ds=20200101) 
  select name from db.tableB

Delta Lake API

df.write.format("delta").mode("overwrite")
.option("replaceWhere", "ds = 20200101").partitionBy(ds)

1.3 混合分区

对 ds=20200101 中的所有 event 的分区进行覆盖写操作,将会清空所有 event 分区
sql

INSERT OVERWRITE TABLE db.tableA partition(ds=20200101,event) 
  select name,event from db.tableB

Delta Lake API

df.write.format("delta").mode("overwrite")
.option("replaceWhere", "ds = 2020010

02 ​后记

  • 分区操作,一定要保证 partition 信息的有序
  • 新表需要从 hive metastore 中获取 partition 信息,Delta Table 在第一次写入数据前,是不会生成 _DELTA_LOG 目录的,此时可以从 hive metastore 中获取建表时的分区名和其对应的类型,例如:
//ddl: `ds` INT COMMENT 'ds'
val ddl = spark.sharedState.externalCatalog.getTable(dbName, tableName).partitionSchema.toDDL
val partitionNameAndType = new mutable.HashMap[String, String]()

ddl.split(",").foreach { r =>
  val x = r.split(" ")
  partitionNameAndType.put(x(0).replace("`", ""), x(1))
}

-语义不同

Hive Table 直接使用 insert overwrite 动态分区只会覆盖数据涉及到的分区,而 Spark 和 Delta Lake 的 API 则会将所有所有分区进行覆盖。Spark 2.3 以后也可以通过下述API实现 Hive insert overwrite 语义

spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
data.write.mode("overwrite").insertInto("partitioned_table")

-动态分区覆盖写是高危操作

该操作很有可能会删除一些你不期望的数据,所以 Delta Lake 目前的 API 提供了 replaceWhere option 进行约束


原文链接


阿里巴巴开源大数据技术团队成立Apache Spark中国技术社区,定期推送精彩案例,技术专家直播,问答区近万人Spark技术同学在线提问答疑,只为营造纯粹的Spark氛围,欢迎钉钉扫码加入!
image.png
对开源大数据和感兴趣的同学可以加小编微信(下图二维码,备注“进群”)进入技术交流微信群。image.png
Spark技术交流社区公众号,微信扫一扫关注image.png

相关文章
Mac安装tree插件
Mac安装tree插件
252 0
|
流计算 SQL API
一文读懂Apache Flink发展史
本文整理自开源大数据专场中阿里巴巴高级技术专家杨克特(鲁尼)先生的精彩演讲,主要讲解了Apache Flink过去和现在的发展情况,同时分享了对Apache Flink未来发展方向的理解。
7007 0
|
Kubernetes Cloud Native 安全
云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)(一)
云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)
2317 0
云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)(一)
|
2月前
|
存储 分布式计算 数据处理
「48小时极速反馈」阿里云实时计算Flink广招天下英雄
阿里云实时计算Flink团队,全球领先的流计算引擎缔造者,支撑双11万亿级数据处理,推动Apache Flink技术发展。现招募Flink执行引擎、存储引擎、数据通道、平台管控及产品经理人才,地点覆盖北京、杭州、上海。技术深度参与开源核心,打造企业级实时计算解决方案,助力全球企业实现毫秒洞察。
373 0
「48小时极速反馈」阿里云实时计算Flink广招天下英雄
|
10月前
|
人工智能 自然语言处理 搜索推荐
如何构建媲美通义千问在线接口的qwen-max智能体
qwen-max智能体是一个高效、多功能的系统,擅长处理查询、文本生成、翻译、图像处理等任务。通过自然语言理解、任务识别、决策引擎和工具选择,它能自动选择最佳方案,满足用户多样化需求,提供智能化服务。系统旨在快速响应、精准执行,并持续优化,支持多任务类型,适应不断变化的需求。
|
12月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
673 0
在Java中处理JSON数据:Jackson与Gson库比较
|
SQL 存储 关系型数据库
Hive 元数据更新
【8月更文挑战第12天】
317 1
|
存储 SQL 分布式计算
Hive存储表数据的默认位置详解
【8月更文挑战第31天】
1133 1
|
分布式计算 资源调度 监控
MapReduce程序中的主要配置参数详解
【8月更文挑战第31天】
719 0
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
1264 1
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移