我正在尝试将数据框保存为文本文件,但是,我收到了File Already Exists异常。我尝试将模式添加到代码但无济于事。此外,该文件实际上并不存在。有人会知道如何解决这个问题吗?我正在使用PySpark
这是代码:
distFile = sc.textFile("/Users/jeremy/Downloads/sample2.nq")
mapper = distFile.map(lambda q: __q2v(q))
reducer = mapper.reduceByKey(lambda a, b: a + os.linesep + b)
data_frame = reducer.toDF(["context", "triples"])
data_frame.coalesce(1).write.partitionBy("context").text("/Users/jeremy/Desktop/so")
我可以补充说,一段时间后会引发异常,并且有些数据实际存储在临时文件中(显然已删除)。
谢谢!
编辑:可以在此处找到异常:https://gist.github.com/jerdeb/c30f65dc632fb997af289dac4d40c743
答案 0 :(得分:0)
您可以使用overwrite
或append
替换文件或将数据添加到同一文件中。
data_frame.coalesce(1).write.mode('overwrite').partitionBy("context").text("/Users/jeremy/Desktop/so")
或
data_frame.coalesce(1).write.mode('append').partitionBy("context").text("/Users/jeremy/Desktop/so")
答案 1 :(得分:0)
我遇到了同样的问题,能够解决这个问题:
outputDir = "/FileStore/tables/my_result/"
dbutils.fs.rm(outputDir , True)
只需将outputDir变量更改为您要写入的目录。
答案 2 :(得分:0)
您应该检查执行器,并查看失败的执行器的日志。
就我而言,我在大型DF上有一个coalesce(1)
。我的4个执行器失败-3个执行器的错误为org.apache.hadoop.fs.FileAlreadyExistsException: File already exists
。
但是,其中1个例外:org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 262144 bytes of memory, got 148328
我能够通过增加执行程序的内存来解决此问题,以便合并不会导致out of memory
错误。