Csv 将文件从复制和读取到dbfs时发生databricks错误,该错误为>;2gb

Csv 将文件从复制和读取到dbfs时发生databricks错误,该错误为>;2gb,csv,apache-spark,databricks,Csv,Apache Spark,Databricks,我有一个6GB大小的csv。 到目前为止,我使用的是下面这行代码,当我在这个副本之后检查dbfs上的大小时 使用JavaIO,它仍然显示为6GB,所以我认为它是正确的。但是当我执行spark.read.csv(samplePath)时,它只读取18mn行,而不是66mn行 Files.copy(Paths.get(_outputFile), Paths.get("/dbfs" + _outputFile)) 因此,我尝试按如下所示复制dbutils,但它给出了错误。我已经更新了maven db

我有一个6GB大小的csv。 到目前为止,我使用的是下面这行代码,当我在这个副本之后检查dbfs上的大小时 使用JavaIO,它仍然显示为6GB,所以我认为它是正确的。但是当我执行spark.read.csv(samplePath)时,它只读取18mn行,而不是66mn行

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(路径)时,默认情况下它会在dbfs上搜索此路径。如何确保它可以从驱动程序内存而不是dbfs中读取此路径?因为我觉得在使用java io和Datatricks时,由于2GB的大小限制,文件副本实际上并没有复制所有行

我可以用这个吗

spark.read.csv("file:/databricks/driver/sampleData.csv")
有什么建议吗


谢谢。

注意:本地文件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:

您可以使用本地文件API读取和写入DBFS路径。Azure DataRicks使用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
import scala.io.Source

val filename = "/dbfs/tmp/test_dbfs.txt"
for (line <- Source.fromFile(filename).getLines()) {
  println(line)
}
Scala:

#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
import scala.io.Source

val filename = "/dbfs/tmp/test_dbfs.txt"
for (line <- Source.fromFile(filename).getLines()) {
  println(line)
}
导入scala.io.Source
val filename=“/dbfs/tmp/test_dbfs.txt”
为了(线路)