我正在集群模式下运行一项大型作业。但是,我只对两个 float 感兴趣,当工作成功时,我想以某种方式读取它们。
这是我正在尝试的:
from pyspark.context import SparkContext
if __name__ == "__main__":
sc = SparkContext(appName='foo')
f = open('foo.txt', 'w')
pi = 3.14
not_pi = 2.79
f.write(str(pi) + "\n")
f.write(str(not_pi) + "\n")
f.close()
sc.stop()
但是,'foo.txt' 似乎没有写在任何地方(可能它被写在执行程序或其他东西中)。我尝试了“/homes/gsamaras/foo.txt”,它是网关的 pwd
。但是,它显示:No such file or directory: '/homes/gsamaras/myfile.txt'
。
怎么做?
import os, sys
import socket
print "Current working dir : %s" % os.getcwd()
print(socket.gethostname())
表明驱动程序实际上是集群的一个节点,这就是为什么我在网关中看不到该文件的原因。
也许以某种方式将文件写入 HDFS?
这也行不通:
Traceback (most recent call last):
File "computeCostAndUnbalancedFactorkMeans.py", line 15, in <module>
f = open('hdfs://myfile.txt','w')
IOError: [Errno 2] No such file or directory: 'hdfs://myfile.txt'
最佳答案
乍一看,您的代码没有什么特别的错误(在这种情况下您应该使用上下文管理器而不是手动关闭,但这不是重点)。如果这个脚本被传递给 spark-submit
文件将被写入驱动程序代码的本地目录。
如果您在集群模式下提交代码,它将是集群中的任意一个工作节点。如果您有疑问,您可以随时记录 os.getcwd()
和 socket.gethostname()
以确定使用的是哪台机器以及工作目录是什么。
最后,您不能使用标准的 Python IO 工具写入 HDFS。有一些工具可以实现这一点,包括 native dask/hdfs3 .
关于python - 将两个 float 写入常规 txt 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39303218/