我的csv大小为6GB。 到目前为止,我正在使用以下行,当我在此副本之后在dbfs上检查其大小时 使用java io,它仍然显示为6GB,因此我认为它是正确的。但是当我执行spark.read.csv(samplePath)时,它仅读取1800万行,而不是6600万行。
Files.copy(Paths.get(_outputFile), Paths.get("/dbfs" + _outputFile))
所以我尝试了dbutils进行复制,如下所示,但是它给出了错误。我已经更新了maven dbutil依赖项,并将其导入了我在调用此行的对象中。还有其他地方我应该做任何更改以在scala代码中使用dbutils在databricks上运行吗?
dbutils.fs.cp("file:" + _outputFile, _outputFile)
Databricks自动假定您执行spark.read.csv(path)时,默认情况下它将在dbfs上搜索此路径。如何确保它可以从驱动程序内存而不是dbfs读取此路径?因为我感觉将java io与databricks结合使用时,由于2GB的大小限制,文件副本实际上并未复制所有行。
我可以使用这个吗?
spark.read.csv("file:/databricks/driver/sampleData.csv")
有什么建议吗?
谢谢。
答案 0 :(得分:1)
注意:本地文件I / O API仅支持小于2GB的文件。如果您使用本地文件I / O API读取或写入大于2GB的文件,则可能会看到损坏的文件。而是使用DBFS CLI,dbutils.fs或Spark API访问大于2GB的文件。
使用Spark API时,您使用“ /mnt/training/file.csv”或“ dbfs:/mnt/training/file.csv”引用文件。如果您使用的是本地文件API,则必须在/ dbfs下提供路径,例如:“ / dbfs / mnt / training / file.csv”。使用Spark API时,不能在dbfs下使用路径。
有多种方法可以解决此问题。
选项1: Access DBFS using local file APIs。
您可以使用本地文件API来读写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阅读。例如:
%fs cp dbfs:/mnt/large_file.csv文件:/tmp/large_file.csv
将熊猫作为pd导入
pd.read_csv('file:/tmp/large_file.csv',)。head()
希望这会有所帮助。