如何处理数据库上的文件
你可以打开文件工作DBFS、集群本地驱动节点、云对象存储、外部位置和在Databricks回购.您可以集成其他系统,但其中许多系统都不提供对Databricks的直接文件访问。
本文的重点是了解与存储在附加到运行集群的临时卷存储中的文件进行交互与存储在DBFS根目录中的文件进行交互之间的区别。您可以直接将DBFS根目录中显示的概念应用到挂载的云对象存储,因为/ mnt
目录在DBFS根目录下。如果您拥有所需的特权,大多数示例还可以应用于与云对象存储和外部位置的直接交互。
“数据库”的根路径是什么?
Databricks上的根路径取决于执行的代码。
DBFS root是Spark和DBFS命令的根路径。这些包括:
火花SQL
DataFrames
dbutils.fs
% fs
附加到驱动程序的块存储卷是本地执行的代码的根路径。这包括:
% sh
大多数Python代码(不是PySpark)
大多数Scala代码(不是Spark)
请注意
如果您在Databricks Repos中工作,则% sh
当前的回收目录。详情请参见以编程方式与工作区文件交互.
访问DBFS根目录上的文件
当使用默认为DBFS根目录的命令时,可以使用相对路径或includedbfs: /
.
选择*从拼花.' <路径>”;选择*从拼花.`dbfs:/<路径>”
df=火花.读.负载(“<路径>”)df.写.保存(“<路径>”)
dbutils.fs.<命令>(“<路径>”)
%fs / . %fs / . %
当使用默认为驱动程序卷的命令时,必须使用/ dbfs
在路径之前。
%sh /dbfs// . sh
进口操作系统操作系统.<命令>(“/ dbfs / <路径>”)
访问驱动文件系统上的文件
当使用默认到驱动程序存储的命令时,可以提供相对路径或绝对路径。
%sh / . sh %sh / . sh
进口操作系统操作系统.<命令>(' / <路径> ')
当使用默认为DBFS根目录的命令时,必须使用文件:/
.
dbutils.fs.<命令>(“文件:/ <路径>”)
%fs file:/ . sh
由于这些文件位于附加的驱动程序卷上,而Spark是分布式处理引擎,因此并非所有操作都可以直接访问这里的数据。如果需要将数据从驱动文件系统移动到DBFS,可以使用神奇的命令或Databricks实用程序复制文件。
dbutils.fs.cp(“文件:/ <路径>”,“dbfs: / <路径>”)
%sh cp / /dbfs/ . sh cp / /dbfs/ . sh
%fs cp file:/ / . sh
通过示例了解默认位置
表格和图表总结并说明了本节中描述的命令以及何时使用每种语法。
命令 |
默认位置 |
从DBFS根目录读取 |
从本地文件系统读取 |
---|---|---|---|
|
DBFS根 |
添加 |
|
|
本地驱动节点 |
添加 |
|
|
DBFS根 |
添加 |
|
|
本地驱动节点 |
添加 |
|
|
DBFS根 |
不支持 |
# %fs的默认位置是root%fs ls /tmp/ %fs mkdirs /tmp/my_cloud_dir %fs cp /tmp/test_dbfs.txt /tmp/file_b.txt
# dbutils的默认位置Fs是根dbutils.fs.ls(“/ tmp /”)dbutils.fs.把(“/ tmp / my_new_file”,“这是云存储中的一个文件。”)
# %sh的默认位置是本地文件系统%sh ls /dbfs/tmp/ . sh
操作系统命令的默认位置是本地文件系统进口操作系统操作系统.listdir(“dbfs / tmp /”)
#使用%fs和dbutils。fs,you must use file:/ to read from local filesystem%fs ls文件:/tmp %fs mkdirs文件:/tmp/my_local_dir dbutils.fs.ls(“文件:/ tmp /”)dbutils.fs.put(“文件:/ tmp / my_new_file”,“这是本地驱动节点上的一个文件。”)
# %sh默认从本地文件系统读取%sh ls /tmp
访问挂载对象存储设备上的文件
通过将对象存储挂载到DBFS,可以像访问本地文件系统一样访问对象存储中的对象。
dbutils.fs.ls(“/ mnt / mymount”)df=火花.读.格式(“文本”).负载(“dbfs: / mymount / my_file.txt”)
本地文件API限制
下面列出了在Databricks Runtime中使用DBFS根目录和挂载的本地文件API的限制。
不支持启用客户端加密的Amazon S3挂载。
不支持随机写。对于需要随机写操作的工作负载,请先在本地磁盘上执行操作,然后再将结果复制到本地磁盘
/ dbfs
.例如:
# python进口xlsxwriter从shutil进口拷贝文件工作簿=xlsxwriter.工作簿(' / local_disk0 / tmp / excel.xlsx ')工作表=工作簿.add_worksheet()工作表.写(0,0,“关键”)工作表.写(0,1,“价值”)工作簿.关闭()拷贝文件(' / local_disk0 / tmp / excel.xlsx ',' / dbfs / tmp / excel.xlsx ')
没有稀疏文件。要复制稀疏文件,使用
cp——稀疏=没有
:
$ cp稀疏。文件/ dbfs / sparse.fileerror writing“/ dbfs / sparse.file”:操作不支持$ cp——sparse=从不稀疏。文件/ dbfs / sparse.file