对于在纱线集群中运行之前在pyspark中的应用程序开发,我想在本地模式下测试它。为此,我需要从工作节点内部明确地写一些数据,我想我可以使用hadoop rest api来实现在集群模式下运行时将文件写入hdfs。但是在本地模式下运行代码时,如何从工作任务中写入文件?
例如: -
sparkConf = SparkConf().setAppName("testing").setMaster("local[*]")
sc= SparkContext(conf=sparkConf)
rdd = sc.textFile("file://path to file")
rdd.map(lambda x:x.split("\t")[0],1).reduce(func_to_reduce);
def func_to_reduce(a,b):
//how can i write value of a and b to a file from here
return a+b;
为了澄清:如果我使用驱动程序端代码中的open()方法写入文件,它会起作用,但如果我使用相同的东西从reduce函数内部写入文件,则不行。任何方向或帮助都非常感谢!!
答案 0 :(得分:0)
您必须实际调用save方法,就像通过textFile
调用加载方法一样。像saveAsTextFile(path)
答案 1 :(得分:0)
请参阅rdd.reduce(f)
soucre代码
Spark在使用reduce
时调用python内置函数rdd.reduce()
两次:一个在工作节点中通过rdd.mapPartitions()
,另一个在驱动程序节点中rdd.collect()
之后。
因此您无法在rdd.reduce
函数
您似乎想在工作节点的本地路径上保存数据吗?
答案 2 :(得分:0)
好吧,我发布这个问题的原因是使用os模块创建目录,并且写入文件的open()方法不能在reduceByKey()函数内部工作。当我在本地模式下运行时,我认为应该可以访问我的驱动程序的本地路径并执行这些功能,就好像我运行的是普通的python脚本一样。之所以不是因为我完全忘记了reduceByKey更像是转换而不是动作的事实,因为reduceByKey()中的代码实际上并没有按照Spark的懒惰评估设计运行。因此,我使用collect()调用了对该引用的操作。现在它启动了reduce功能,并且正在编写文件。谢谢你的帮助!!!!