databricks 错误,将文件从 > 2gb 复制和读取到 dbfs
databricks error to copy and read file from to dbfs that is > 2gb
我有一个大小为 6GB 的 csv。
到目前为止,我使用的是以下行,当我在此副本后检查其在 dbfs 上的大小时
使用 java io,它仍然显示为 6GB,所以我认为它是正确的。但是当我执行 spark.read.csv(samplePath) 时,它只读取 1800 万行而不是 6600 万行。
Files.copy(Paths.get(_outputFile), Paths.get("/dbfs" + _outputFile))
所以我尝试使用 dbutils 进行复制,如下所示,但出现错误。我已经更新了 maven dbutil 依赖项并在我调用此行的对象中导入了相同的依赖项。还有其他地方我应该做任何更改以在 scala 代码中使用 dbutils 到数据块上的 运行 吗?
dbutils.fs.cp("file:" + _outputFile, _outputFile)
Databricks 自动假定当您执行 spark.read.csv(path) 时,它会默认在 dbfs 上搜索此路径。如何确保它可以从驱动程序内存而不是 dbfs 中读取此路径?因为我觉得在将 java io 与数据块一起使用时,由于 2GB 的大小限制,文件副本实际上并未复制所有行。
我可以用这个吗:
spark.read.csv("file:/databricks/driver/sampleData.csv")
对此有什么建议吗?
谢谢。
注意:本地文件I/OAPI只支持小于2GB的文件。如果您使用本地文件 I/O APIs 读取或写入大于 2GB 的文件,您可能会看到损坏的文件。相反,使用 DBFS CLI dbutils.fs 或 Spark APIs.
访问大于 2GB 的文件
当您使用 Spark APIs 时,您使用“/mnt/training/file.csv”或“dbfs:/mnt/training/file.csv”引用文件。如果您使用本地文件 APIs,则必须提供 /dbfs 下的路径,例如:“/dbfs/mnt/training/file.csv”。使用 Spark APIs.
时不能使用 dbfs 下的路径
有多种方法可以解决这个问题。
选项 1: Access DBFS using local file APIs.
您可以使用本地文件 APIs 读取和写入 DBFS 路径。 Azure Databricks 为每个集群节点配置一个 FUSE 挂载,允许集群节点上的进程 运行 使用本地文件 API 读取和写入底层分布式存储层。例如:
Python:
#write a file to DBFS using python i/o apis
with open("/dbfs/tmp/test_dbfs.txt", 'w') as f:
f.write("Apache Spark is awesome!\n")
f.write("End of example!")
# read the file
with open("/dbfs/tmp/test_dbfs.txt", "r") as f_read:
for line in f_read:
print line
Scala:
import scala.io.Source
val filename = "/dbfs/tmp/test_dbfs.txt"
for (line <- Source.fromFile(filename).getLines()) {
println(line)
}
选项 2: Reading Large DBFS-Mounted files using Python APIs.
将文件从 dbfs:// 移动到本地文件系统 (file://)。然后使用Python阅读API。例如:
- 将文件从 dbfs:// 复制到 file://:
%fs cp dbfs:/mnt/large_file.csv file:/tmp/large_file.csv
- 读取pandas中的文件API:
import pandas as pd
pd.read_csv('file:/tmp/large_file.csv',).head()
希望对您有所帮助。
我有一个大小为 6GB 的 csv。 到目前为止,我使用的是以下行,当我在此副本后检查其在 dbfs 上的大小时 使用 java io,它仍然显示为 6GB,所以我认为它是正确的。但是当我执行 spark.read.csv(samplePath) 时,它只读取 1800 万行而不是 6600 万行。
Files.copy(Paths.get(_outputFile), Paths.get("/dbfs" + _outputFile))
所以我尝试使用 dbutils 进行复制,如下所示,但出现错误。我已经更新了 maven dbutil 依赖项并在我调用此行的对象中导入了相同的依赖项。还有其他地方我应该做任何更改以在 scala 代码中使用 dbutils 到数据块上的 运行 吗?
dbutils.fs.cp("file:" + _outputFile, _outputFile)
Databricks 自动假定当您执行 spark.read.csv(path) 时,它会默认在 dbfs 上搜索此路径。如何确保它可以从驱动程序内存而不是 dbfs 中读取此路径?因为我觉得在将 java io 与数据块一起使用时,由于 2GB 的大小限制,文件副本实际上并未复制所有行。
我可以用这个吗:
spark.read.csv("file:/databricks/driver/sampleData.csv")
对此有什么建议吗?
谢谢。
注意:本地文件I/OAPI只支持小于2GB的文件。如果您使用本地文件 I/O APIs 读取或写入大于 2GB 的文件,您可能会看到损坏的文件。相反,使用 DBFS CLI dbutils.fs 或 Spark APIs.
访问大于 2GB 的文件当您使用 Spark APIs 时,您使用“/mnt/training/file.csv”或“dbfs:/mnt/training/file.csv”引用文件。如果您使用本地文件 APIs,则必须提供 /dbfs 下的路径,例如:“/dbfs/mnt/training/file.csv”。使用 Spark APIs.
时不能使用 dbfs 下的路径有多种方法可以解决这个问题。
选项 1: Access DBFS using local file APIs.
您可以使用本地文件 APIs 读取和写入 DBFS 路径。 Azure Databricks 为每个集群节点配置一个 FUSE 挂载,允许集群节点上的进程 运行 使用本地文件 API 读取和写入底层分布式存储层。例如:
Python:
#write a file to DBFS using python i/o apis
with open("/dbfs/tmp/test_dbfs.txt", 'w') as f:
f.write("Apache Spark is awesome!\n")
f.write("End of example!")
# read the file
with open("/dbfs/tmp/test_dbfs.txt", "r") as f_read:
for line in f_read:
print line
Scala:
import scala.io.Source
val filename = "/dbfs/tmp/test_dbfs.txt"
for (line <- Source.fromFile(filename).getLines()) {
println(line)
}
选项 2: Reading Large DBFS-Mounted files using Python APIs.
将文件从 dbfs:// 移动到本地文件系统 (file://)。然后使用Python阅读API。例如:
- 将文件从 dbfs:// 复制到 file://:
%fs cp dbfs:/mnt/large_file.csv file:/tmp/large_file.csv
- 读取pandas中的文件API:
import pandas as pd
pd.read_csv('file:/tmp/large_file.csv',).head()
希望对您有所帮助。