【问题标题】:The function passed to map never gets called传递给 map 的函数永远不会被调用
【发布时间】:2016-10-26 20:38:13
【问题描述】:

我正在尝试通过 spark 中的 map 函数进行函数调用。 我做了 spark 教程页面 (https://spark.apache.org/docs/1.2.0/programming-guide.html) 中给出的内容。但是函数myFunc 永远不会被调用。至少我是这么认为的。我不知道我是做错了什么还是错过了什么。 这是以下代码:

from pyspark import SparkContext
if __name__ == "__main__":
    def myFunc(s):
        print("@@")
        words = s.split("\n")
        print("##")
        return len(words)


    sc = SparkContext("local","test")
    sc.textFile("C:\\TestLogs\\sample.log").map(myFunc)
    print("**")

输出:

**

事实上,除了文件位置之外,这与 spark doc 中的示例相同。

【问题讨论】:

  • 我不懂 Python,但你用参数定义了你的函数。当你调用它时,你没有传递任何参数。你确定没问题?
  • @kaks 我不知道 Spark,但是映射的东西 empty 甚至不会调用一次函数。您能否确认您的文件确实提供了任何数据?
  • @facundop :是的,它有一个参数。但是在 spark 文档中,在 map 中,myFunc 不带参数,即使函数是用s 定义的。 @ŁukaszRogalski:是的,sample.log 文件有 10 个日志行。

标签: python-3.x apache-spark pyspark


【解决方案1】:

看来你有不叫行动而已转换map(myFunc)

Spark 中的所有转换都是惰性的,因为它们不计算 他们的结果马上。相反,他们只是记住 应用于某些基础数据集(例如文件)的转换。这 只有动作需要结果时才会计算转换 返回到驱动程序。

尝试使用map(myFunc).saveAsTextFile("folder/here.txt") 或您想使用的其他action

【讨论】:

    【解决方案2】:

    您的代码似乎缺少执行转换所需的火花“动作”(例如“收集”)(例如“地图”)。

    尝试以下方法:

    from pyspark import SparkContext
    if __name__ == "__main__":
        def myFunc(s):
            print("@@")
            words = s.split("\n")
            print("##")
            return len(words)
    
    
        sc = SparkContext("local","test")
        myrdd = sc.textFile("C:\\TestLogs\\sample.log")
        result =  myrdd.map(myFunc).collect()
        print "the result is"
        print result
        print("**")
    

    考虑更新以下内容以保存 "file:\\" (https://stackoverflow.com/a/27301040/5088142)

        myrdd = sc.textFile("file:\\C:\\TestLogs\\sample.log")
    

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2017-12-17
      • 2018-09-02
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多