在群集中处理时,是否可以在驱动程序节点中写出spark程序的结果?
df = sqlContext("hdfs://....")
result = df.groupby('abc','cde').count()
result.write.save("hdfs:...resultfile.parquet", format="parquet") # this works fine
result = result.collect()
with open("<my drivernode local directory>//textfile") as myfile:
myfile.write(result) # I'll convert to python object before writing
有人可以介绍一下如何引用我提供spark-submit
的本地文件系统吗?
答案 0 :(得分:3)
tl; dr 使用.
(点),当前工作目录由API解析。
答案 1 :(得分:0)
根据我对您的问题的理解,您在运行spark时询问是否在驱动程序或工作程序中保存本地文件。
这是可能的,而且非常简单。
关键是,最后,驱动程序和工作人员正在运行python,因此你可以使用python&#34;打开&#34;,&#34;&#34;,&#34;写&#34;等等。
要在你需要经营的工人中做到这一点&#34; foreach&#34;或&#34;地图&#34;在您的rdd上然后在本地保存(这可能很棘手,因为您可能在每个执行程序上有多个分区)。
从驱动程序中保存更加容易,在收集数据后,您就拥有了常规的python对象,并且可以以任何搁浅的pythonic方式保存它。
<强> BUT 强>
当您保存任何本地文件时,可能是在工作者或驱动程序上,该文件是在工作者或驱动程序正在运行的容器内创建的。一旦执行完毕,这些容器就是< strong>已删除,您将无法访问存储在其中的任何本地数据。
解决此问题的方法是在容器仍处于活动状态时将这些本地文件移动到某处。您可以使用shell命令,插入数据库等来执行此操作。
例如,我使用这种技术将计算结果插入MySQL而无需进行收集。我将结果本地保存在工人身上,作为&#34; map&#34;的一部分。操作,然后使用MySQL&#34; LOAD DATA LOCAL INFILE&#34;。
上传它们