2017-07-28 86 views
0

我有以下代码Spark:为什么我的UDF没有在rdd映射中调用?

def get_general_popularity_count(): 
    def test(t): 
     a = 1 # this is just a random variable for testing 
     print "a" 
     pickle.dump(a, open("a.p", "wb")) 
    count_dict = pickle.load(open("list.p","rb")) 
    rdd = session.sparkContext.parallelize(count_dict) 
    rdd.map(lambda x:test(x)) 

但是,没有打印,咸菜没有保存文件要么。事实上,我知道UDF从来没有被调用,因为一旦我在test(x)中有语法错误,但程序从未捕获它。
那么为什么我的UDF永远不会打电话?任何帮助表示赞赏

回答

1

它不会被调用,因为map是一种转换。除非后面跟着一个动作,否则Spark根本没有理由执行它。

而且你的代码是不是Apache的星火一个不错的选择:

  • print输出数据到工人的标准输出。
  • pickle.dump将写入工作人员的本地文件系统,并在执行像map这样的操作时,再次覆盖输出。

你可以尝试RDD.foreachRDD.saveAsPickleFile

+0

非常感谢你。从我从文档中看到,foreach在每个集群上执行,所以如果我有一个本地字典,并且我想在rdd中的每一行上运行某种函数,然后将其添加到字典中,那么这将如何工作? – Pear

相关问题