2.数据湖DeltaLake之DDL操作

转载自  2.数据湖DeltaLake之DDL操作

前面讲了delta lake简介,特性及基本操作。本文主要是讲DeltaLake的DDL操作,实际上是依赖于spark datasourcev2 和catalog API(3.0+)的,所以Deltalake整合spark的时候最好是3.0开始吧,正好最近spark 3.0也发布了。

对创建sparksession有点要求,需要加上两个配置:

valspark = SparkSession  .builder()  .appName(this.getClass.getCanonicalName)  .master("local[2]")  .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")  .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") .getOrCreate()

1. 创建表

deltalake创建一张表有两种方式:

1). DataFrameWriter,这个大家不陌生,spark默认写文件的方式。

df.write.format("delta").saveAsTable("events") // create table in the metastore
df.write.format("delta").save("/delta/events") // create table by path

2). DeltaLake也支持使用spark sql新的DDL操作来创建表,CREATE TABLE.

-- Create table in the metastoreCREATE TABLE events (  date DATE,  eventId STRING,  eventType STRING,  data STRING)USING DELTA

当创建使用Deltalake在metastore中创建一张表的时候,会在metastore中记录数据的位置信息。这样好处很明显,其他人使用的时候就比较方便查找,不用关注数据的真是存储位置。然而,metastore里不会存储数据内容是否有效。

 

2.数据分区

生产中使用构建数仓的时候会对数据进行分区操作,加速查询,优化DML操作。使用Delta lake创建分区表的时候,只需要指定一个分区列即可。下面是一个按照常见的按照时间进行分区的例子:

1).DDL操作

-- Create table in the metastoreCREATE TABLE events ( date DATE, eventId STRING, eventType STRING, data STRING)USING DELTAPARTITIONED BY (date)LOCATION '/delta/events'

2).Scala API

df.write.format("delta").partitionBy("date").saveAsTable("events")     // create table in the metastore
df.write.format("delta").partitionBy("date").save("/delta/events")  // create table by path

3.指定存储位置

其实,我们可以控制Delta lake的表数据文件的存储位置,在写DDL的时候可以指定path。

这个其实很像hive 的外部表的功能,指定位置的delta lake的表,可以视为是不会被metastore管理的,这种表在删除的时候,不会被真实删除数据。

假设创建Delta lake表的时候,指定的路径里数据文件已经存在,创建的时候delta lake 会做以下事情:

1).如果你仅仅在创建的时候指定了表名称和路径,如下:

CREATE TABLE eventsUSING DELTALOCATION '/delta/events'

hive metastore的表会自动从存在的数据中推断出schema,partition,和属性。该功能可用于将数据导入metastore中。

2).假设你指定了一些配置(schema,partition,或者表的属性),delta lake只会从已有数据中识别出你指定的配置信息,而不是全部配置。假设你指定的配置在已有数据中不存在,那么会抛出不一致异常。

3.读数据

数据可以直接支持sql查询,老spark用户也可以直接使用dataframe api去查询数据。

sql查询

SELECT * FROM events -- query table in the metastore
SELECT * FROM delta.`/delta/events` -- query table by path

dataframe查询

spark.table("events") // query table in the metastore
spark.read.format("delta").load("/delta/events") // create table by path

dataframe会自动读取最新的数据快照,用户不需要进行refresh table。当可以使用谓词下推的时候 delta lake会自动使用分区器和统计信息进行优化查询,进而减少数据加载。

 

4.写数据

a).Append

spark自身的append模式就可以完成往已有表里追加数据:​​​​​​​

df.write.format("delta").mode("append").save("/delta/events")
df.write.format("delta").mode("append").saveAsTable("events")

当然,delta 也支持insert into:​​​​​​​

INSERT INTO events SELECT * FROM newEvents

b).overwrite

delta lake也支持直接覆盖整张表,直接使用overwrite模式即可。

dataframe api如下:​​​​​​​

df.write.format("delta").mode("overwrite").save("/delta/events")
df.write.format("delta").mode("overwrite").saveAsTable("events")

SQL API格式如下:​​​​​​​

INSERT OVERWRITE events SELECT * FROM newEvents

使用Dataframe的时候,也可以支持只是覆盖指定分区的数据。下面的例子就是只覆盖一月份的数据:​​​​​​​

df.write.format("delta").mode("overwrite").option("replaceWhere", "date >= '2017-01-01' AND date <= '2017-01-31'").save("/delta/events")

这段代码会自动将数据以dataframe的形式写出到指定的deltalake表分区里,然后执行原子替换。

注意:

默认delta lake只支持数据的覆盖,不支持schema的覆盖替换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj4804-[NOIP2016提高A组模拟9.28]成绩调研【指针,模拟】

正题 题目大意 求一个序列里有多少个区间满足kkk的个数在lr∼rkl_r\sim r_klr​∼rk​之间 解题思路 首先十分显然对于一个固定的右端点rrr可以匹配的左指针一定是一个区间[L2..L1−1][L_2..L_1-1][L2​..L1​−1]。 也就是[L2..L1−1][L_2..L_1-1][L2​..L1​−1]任意一个作…

.Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)

现在&#xff0c;因为种种因素&#xff0c;你必须对一个请求或者方法进行频率上的访问限制。 比如&#xff0c; 你对外提供了一个API接口&#xff0c;注册用户每秒钟最多可以调用100次&#xff0c;非注册用户每秒钟最多可以调用10次。比如&#xff0c; 有一个非常吃服务器资源的…

(八)IT_开发常用单词大全

开发单词 单词 音标 注释 a collection of… 一组… a couple of… 几个 a kind of 一种 a number of… 许多… a point in time n.时间点 a set of… 一组… a series of 一系列 ability [əbɪlətɪ] n.能力 absence [ˈbsəns] …

1.数据湖deltalake初识

转载自 1.数据湖deltalake初识 1.delta特性简介 Delta Lake是Spark计算框架和存储系统之间带有Schema信息数据的存储中间层。它给Spark带来了三个最主要的功能&#xff1a; 第一&#xff0c;Delta Lake使得Spark能支持数据更新和删除功能&#xff1b; 第二&#xff0c;Del…

Quartz.NET 3.0 正式发布

Quartz.NET是一个强大、开源、轻量的作业调度框架&#xff0c;你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征&#xff0c;如&#xff1a;数据库支持&#xff0c;集群&#xff0c;插件&#xff0c;支持cron-like表达式等等。在2017年的最后一天Quartz.…

jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】

正题 题目大意 一棵树一个人从sss开始&#xff0c;有两个追击者从p,qp,qp,q出发&#xff0c; 在3k1s3k1\ s3k1 s&#xff0c;那个人走 在3k2和3k3s3k2和3k3\ s3k2和3k3 s&#xff0c;追击者走。 求那个人最久多久不会被追上。 解题思路 首先计算出每个点距离两个追击者和那个…

ScheduledThreadPool中的Leader-Follow模式你知道不?

转载自 ScheduledThreadPool中的Leader-Follow模式你知道不&#xff1f; ScheduledThreadPoolExecutor 是java中一个非常常用的定时调度的工具&#xff0c;其提供了两种定时调度常用模式: 1.固定调度周期的任务执行。 2.固定延迟间隔的任务执行&#xff0c;延迟间隔表示的是…

(九)IDEA便捷配置MyBatis.xml文件

在使用IDEA新建mybatis.xml经常需要手动复制粘贴之前的xml配置。这样也比较麻烦。我们可以IDEA进行关于xml的配置 1.创建MyBatis Config的模版 1.打开新增2.查看编辑页面查看编辑页面 我们看到Name&#xff1a;为我们新增模版的文件名称。Extension&#xff1a;为我们新增文件…

用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api

目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个python 的 rest api, 我暂时选用了hug, 官网在这: http://www.hug.rest/.目前项目使用的是identity server 4, 还有一些web api和js client.项目…

欢乐纪中A组莫名其妙赛【2019.6.6】

前言 好像明天他们就高考了&#xff0c;先祝福一波。 然后今天AKKKKKKKKKKKKKKKKKKKKKKKKK!AKKKKKKKKKKKKKKKKKKKKKKKKK!AKKKKKKKKKKKKKKKKKKKKKKKKK! 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(…

MySQL死锁如何处理

转载自 MySQL死锁如何处理 前提 笔者负责的一个系统最近有新功能上线后突然在预警模块不定时报出MySQL死锁导致事务回滚。幸亏&#xff0c;上游系统采用了异步推送和同步查询结合的方式&#xff0c;感知到推送失败及时进行了补偿。于是&#xff0c;笔者争取了一点时间详细分析…

(十)IDEA添加mybatis-mapp.xml文件

1.点击file–Settings–Editor–file and Code Templates 2.配置mybatis-mapper.xml的网址,点击file–Settings–ages& Frameworks–Schmas and DTDs 3.创建mapper.xml文件

g4e基础篇#2 Git分布式版本控制系统的优势

1. 基础篇&#xff1a;为什么要使用版本控制系统Git 分布式版本控制系统的优势Git 安装和设置初始化Git存储库(Repo)起步 1 – 创建分支和保存代码起步 2 – 了解Git历史记录起步 3 – 拉取请求 Pull Request 工作机制Git是当前最棒的版本控制系统&#xff0c;已经迅速成为了事…

P4989-二进制之谜【堆,贪心】

正题 题目链接:https://www.luogu.org/problemnew/show/P4989 题目大意 一个二进制数两两配对&#xff0c;要求 配对的数不能交叉(用同一个区间但不包含)0在前1在后 要求配对最多的情况下所有配对的距离之和最远。 解题思路 将0视为左括号&#xff0c;1视为右括号&#xf…

案例分析 | 由Decimal操作计算引发的Spark数据丢失问题

转载自 案例分析 | 由Decimal操作计算引发的Spark数据丢失问题 供稿 | Hadoop Team 编辑 | 顾欣怡 本文3058字&#xff0c;预计阅读时间10分钟 导读 eBay的Hadoop集群上面每天运行着大量Spark计算任务。对于数据计算任务&#xff0c;其计算性能十分重要&#xff0c;数据质…

(十一)MyBatis的动态SQL:trim元素

trim标记是一个格式化的标记&#xff0c;可以完成select&#xff0c;update&#xff0c;insert语句的格式化操作。trim元素的主要功能有四个&#xff1a; &#xff08;1&#xff09;可以在包含的内容前加上某些前缀&#xff0c;与之对应的属性是prefix&#xff1b; &#xff08…

入门干货之Electron的.NET实现-Electron.NET

0x01、Electron.NET1、介绍Electron是由Github上的一支团队和一群活跃贡献者维护。用HTML&#xff0c;CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将Chromium和Node.Js合并到同一个运行时环境中&#xff0c;并将其打包为Mac&#xff0c;Windows和Linu…

P2514-[HAOI2010]工厂选址【贪心】

正题 题目链接:https://www.luogu.org/problemnew/show/P2514 题目大意 有一个厂&#xff0c;需要bbb吨煤炭&#xff0c;然后第jjj个矿运到该厂的运费为c0,jc_{0,j}c0,j​&#xff0c;运行总费用为运费之和加上h0h_0h0​ 现在在1∼n1\sim n1∼n挑选一个建一个新厂&#xff0…

Scala与Java差异(三)之函数

一、函数定义 &#xff08;1&#xff09;函数的定义与调用 在Scala中定义函数时&#xff0c;需要定义函数的函数名、参数、函数体。 第一个函数如下所示&#xff1a; def sayHello(name: String, age: Int) {if (age > 18) { printf("hi %s, you are a big boy\n&…

(十二)C3P0连接池使用教程

一般我们在项目中操作数据库时&#xff0c;都是每次需要操作数据库就建立一个连接&#xff0c;操作完成后释放连接。因为jdbc没有保持连接的能力&#xff0c;一旦超过一定时间没有使用&#xff08;大约几百毫秒&#xff09;&#xff0c;连接就会被自动释放掉。而每次新建连接都…