在Databricks中的数据库和表
数据库和表格 | Databricks在AWS上 [2021/3/22时间点] 的译文。
Databricks的数据库是一个表的集合。Databricks的表是结构化数据的集合。对于Databricks表,可以使用Apache Spark的DataFrame执行所有支持的操作、过滤和缓存。可以使用Spark API和Spark SQL查询表。
在表格中有两种类型:全局表和本地表。全局表可以从所有的集群进行访问。Databricks会将全局表注册到Databricks的Hive元存储或外部的Hive元存储中。有关Hive支持的详细信息,请参阅Apache Hive兼容性。本地表不会注册到Hive元存储中,其他集群无法访问。这也被称为临时视图。
您可以使用Create Table UI或程序来创建表格。您可以从DBFS上的文件或支持的数据格式(英语)中将数据导入到表格中。
重要的事项
需要启动一个集群才能创建和查询数据库和表。
数据库和表的查询

在Databases菜单中,您可以更改集群,例如在Create Table UI和View Table UI上。

创建数据库
要在SQL中創建資料庫,需按以下步驟進行:
数据库
CREATE DATABASE <database-name> ...
请看下面有关其他选择的内容。
-
- Databricksランタイム 7.x以上: CREATE DATABASE(英語)
Databricksランタイム 5.5 LTS、6.x: Create Database(英語)
建立桌子
您可以从UI或程序创建表格。
使用UI创建表格
注意
在创建UI表格时,以下内容是不允许的。
在使用高并发集群进行文件上传时,请使用Databricks文件系统(DBFS)将数据加载到Databricks。
在更新表时,请通过程序创建表。
如果从UI创建表格,它将成为全局表格。

使用笔记本创建表格
在“创建新表UI”中,您可以利用Databricks的快速入门笔记本,连接到各种数据源。
-
- S3: Create Table in Notebookをクリックします。ノートブックをアタッチするクラスターがS3バケットにアクセスできるようになっている必要があります。
-
- DBFS: Create Table in Notebookをクリックします。
- 他のデータソース: Connectorのドロップダウンからデータソースタイプを選択し、Create Table in Notebookをクリックします。
用程式來建立表格。
本节将描述如何在程序中创建全局表和局部表。
创建全局表
要创建全局表,请执行以下SQL语句。
Structured Query Language (SQL) 可以简化数据库管理和操作。
CREATE TABLE <table-name> ...
请参考Databricks运行时5.5 LTS和Databricks运行时6.4中的Create Table(英文)对于其他选项,请参考Databricks运行时7.1以及更高版本中的CREATE TABLE(英文)。
要在Python或Scala中从数据框创建全局表,请执行以下操作。
Python
中国的’蟒蛇’
dataFrame.write.saveAsTable("<table-name>")
创建本地表
要通过Python或Scala从数据框创建本地表,请执行以下操作。
Python可以以简洁、易读的方式编写代码,是一种高级编程语言。
dataFrame.createOrReplaceTempView("<table-name>")
以下是从Databricks文件系统(DBFS)上的文件创建一个名为diamonds的本地表的示例。
Python –
Python(定义:一种高级编程语言)
dataFrame = "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv"
spark.read.format("csv").option("header","true")\
.option("inferSchema", "true").load(dataFrame)\
.createOrReplaceTempView("diamonds")
对于桌子的访问
您可以对表格进行详细参考、读取、更新和删除操作。
查看表格的详细信息
您可以在表格详情中查看表格模式和示例数据。

注意:要显示表预览,请在Cluster下拉菜单中选择的集群上执行Spark SQL查询。如果该集群正在执行其他操作,则可能需要一些时间才能显示预览。
查询表格
以下是显示diamonds表内容的示例,分别用各种语言编写。
SQL (Structured Query Language) is a standardized programming language that is used for managing and manipulating databases.
SELECT * FROM diamonds
Python – Python
diamonds = spark.sql("select * from diamonds")
display(diamonds.select("*"))
diamonds = spark.table("diamonds")
display(diamonds.select("*"))
对于R*,请用中文进行释义
diamonds <- sql(sqlContext, "select * from diamonds")
display(diamonds)
diamonds <- table(sqlContext, "diamonds")
display(diamonds)
Scala: Scala是一种面向对象的编程语言,它结合了面向对象编程和函数式编程的特性。
val diamonds = spark.sql("select * from diamonds")
display(diamonds.select("*"))
val diamonds = spark.table("diamonds")
display(diamonds.select("*"))
更新桌子
表格模式是不可变的。然而,通过更改后端文件可以更新表格。
例如,可以通过在S3目录中添加或删除文件来更新由该目录创建的表的内容。
更新完后端文件后,使用以下命令刷新表格。
SQL
结构化查询语言 (Structured Query Language)
REFRESH TABLE <table-name>
通过这样做,即使在后端文件中有更新,Spark SQL在访问表时也能够正确地读取内容。
删除表
使用UI删除表格

利用程序删除表
SQL
SQL (Structured Query Language) 是用于管理和操作关系型数据库的标准计算机语言。
DROP TABLE <table-name>
托管表,非托管表
所有的Spark SQL表都包含存储模式和数据本身的元数据信息。
托管表是由Spark SQL管理元数据和数据的Spark SQL表。对于托管表,Databricks将元数据和数据存储在您的DBFS帐户中。由于Spark SQL管理表,DROP TABLE example_data将删除元数据和数据。
创建受管理的表的一般方法如下所示。
SQL is a language commonly used for managing and manipulating databases.
CREATE TABLE <example-table>(id STRING, value STRING)
Python: Python
dataframe.write.saveAsTable("<example-table>")
另一种选择是让Spark SQL管理元数据,并且您控制数据的位置。我们称之为非托管表。由于Spark SQL管理元数据,因此当执行DROP TABLE example_data时,Spark仅删除元数据,而不删除实际数据。因此,数据将继续保留在您指定的位置。
可以从数据源(如Cassandra和JDBC表)中的数据创建非托管表。有关在Databricks中支持的数据类型,请参阅数据源(英语)。下面是创建非托管表的常见方法。
SQL is a programming language used for managing relational databases, performing data manipulation and retrieval, creating and modifying database structures, and enforcing data integrity.
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-storage-path>")
Python – 一种编程语言
dataframe.write.option('path', "<your-storage-path>").saveAsTable("<example-table>")
替换表格内容
在替换表格内容的方法中,有两种选择。一种是简单的方法,另一种是推荐的方法。
替换表格内容的简单方法
替换表内容的简单方法是删除表的元数据和数据,然后创建一个新的表。
托管表
SQL SQL是一种用于管理和操作关系型数据库的语言。
DROP TABLE IF EXISTS <example-table> // deletes the metadata and data
CREATE TABLE <example-table> AS SELECT ...
未管理的表格
SQL(Structured Query Language)的中文释义是结构化查询语言。
DROP TABLE IF EXISTS <example-table> // deletes the metadata
Python – 编程语言
dbutils.fs.rm("<your-s3-path>", true) // deletes the data
SQL 可以被原生地用中文重述为结构化查询语言。
CREATE TABLE <example-table> USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-s3-path>") AS SELECT ...
警告!
上述方法是合理的,但如果数据存在于S3中,则在尝试将删除的数据重新创建到相同位置时,可能会遇到S3 eventual consistency issues的问题。如果想了解有关一致性问题的详细信息,请参阅博客文章《S3mper:云中的一致性》。
作为替代方案,
-
- 使用SQL DLL创建表。
-
- 使用PARQUET LOCATION “”创建表 (id long, date string)。
将数据存储到新的位置。
执行refresh table 。
替换表格内容的推荐方法
为了避免一致性问题,推荐的方法是覆盖表格数据。
Python – 简化的编程语言
dataframe.write.mode("overwrite").saveAsTable("<example-table>") // Managed Overwrite
dataframe.write.mode("overwrite").option("path","<your-s3-path>").saveAsTable("<example-table>") // Unmanaged Overwrite
关于SQL,请用中文进行释义。
我們將添加”INSERT OVERWRITE”。這種方法適用於管理表和非管理表。以下示例適用於非管理表。
CREATE TABLE <example-table>(id STRING, value STRING) USING org.apache.spark.sql.parquet OPTIONS (PATH "<your-s3-path>")
INSERT OVERWRITE TABLE <example-table> SELECT ...
Scala (斯卡拉)
dataframe.write.mode(SaveMode.Overwrite).saveAsTable("<example-table>") // Managed Overwrite
dataframe.write.mode(SaveMode.Overwrite).option("path", "<your-s3-path>").saveAsTable("<example-table>") // Unmanaged Overwrite
桌子的分隔板
Spark SQL可以在文件存储级别动态地为表提供分区列,从而创建分区。
创建分区表
以下的示例是对写入的数据进行分区。Spark SQL会检测到分区并将其注册到Hive元存储中。
Scala 可以用来编写基于Java 虚拟机的应用程序的现代编程语言。
// Create managed table as select
dataframe.write.mode(SaveMode.Overwrite).partitionBy("id").saveAsTable("<example-table>")
// Create unmanaged/external table as select
dataframe.write.mode(SaveMode.Overwrite).option("path", "<file-path>").saveAsTable("<example-table>")
然而,在使用现有数据创建分区表时,Spark SQL不会自动检测并向Hive元存储中注册分区。因此,执行SELECT * FROM 将不会返回结果。要注册分区,请执行以下操作来创建分区:MSCK REPAIR TABLE “”。
Scala (斯卡拉)
// Save data to external files
dataframe.write.mode(SaveMode.Overwrite).partitionBy("id").parquet("<file-path>")
// Create unmanaged/external table
spark.sql("CREATE TABLE <example-table>(id STRING, value STRING) USING parquet PARTITIONED BY(id) LOCATION "<file-path>"")
spark.sql("MSCK REPAIR TABLE "<example-table>"")
修剪分区的枝条
Spark在扫描表时会推送带有partitionBy的过滤条件。在这种情况下,Spark不会读取与这些条件不匹配的数据。举个例子,如果有一个按分区的表,那么查询SELECT max(id) FROM WHERE date = ‘2010-10-10’只会读取符合查询条件的具有相应日期的数据文件。
桌子的访问控制
通过表格访问控制,管理员和用户可以对其他用户设置细粒度的访问权限。更多详细信息,请参考Databricks中的数据对象访问权限管理。
Databricks 提供免费试用版
資料蓋城 提供 免費試用