在pyspark中传递函数

时间:2016-05-31 19:46:11

标签: pyspark

代码的目的是根据" myFunc"加载计算一些逻辑。在RDD上运行以获得并行化效益的方法。

以下行: df_rdd = ParallelBuild()。run()。map(lambda line:line).persist() r = df_rdd.map(ParallelBuild()。myFunc)

给了我退出0.阅读谷歌建议Spark是懒惰的评价所以一些动作将触发效果,我添加:

r.count()告诉我:

TypeError: 'JavaPackage' object is not callable

值得注意的是: r = df_rdd.map(ParallelBuild()。myFunc)

给出" pipelinedrdd"不确定那是什么,但看起来像是一些转变?

有趣的是,当我删除了run方法并实现了: data = [(1,' a'),(1,' b'),(1,' c'),(2,' d& #39;),(3,' r'),(4,' a'),(2,' t'),(3,') ; y'),(1,' f')] df = sqlContext.createDataFrame(data,schema = [' uid',' address_uid'])

直接在我的主要功能中然后事情就好了。但显然我松开了代码的模块化部分。

代码:

from pyspark import SparkContext
from pyspark.sql import SQLContext, HiveContext
import csv, io, StringIO
from pyspark.sql.functions import *
from pyspark.sql import Row
from pyspark.sql import *
from pyspark.sql import functions as F
from pyspark.sql.functions import asc, desc
sc = SparkContext("local", "Summary Report")
sqlContext = SQLContext(sc)


class ParallelBuild(object):

def myFunc(self, s):
   l =  s.split(',')
   print l[0], l[1]
   return l[0]


def list_to_csv_str(x):
    output = StringIO.StringIO("")
    csv.writer(output).writerow(x)
    return output.getvalue().strip()

def run(self):
    data = [(1,'a'), (1,'b'), (1,'c'), (2,'d'), (3,'r'), (4,'a'), (2,'t'), (3,'y'), (1,'f')]
    df = sqlContext.createDataFrame(data, schema= ['uid', 'address_uid'])
    return df


if __name__ == "__main__":

    df_rdd = ParallelBuild().run().map(lambda line: line).persist()
    r = df_rdd.map(ParallelBuild().myFunc)
    r.count()

1 个答案:

答案 0 :(得分:0)

好的,所以你的主要问题是“为什么没有印刷?”答案分为两部分。

  1. 您无法在分布式计算中print。因此,您的函数myFunc不会向驱动程序打印任何内容。这样做的原因相当复杂,因此我将引导您this page以获取有关为什么打印在Spark中不起作用的更多信息。
  2. 但是,调用r.count()应打印出9。为什么不起作用?

    1. 您的功能myFunc没有多大意义。当你在r = df_rdd.map(ParallelBuild().myFunc)中调用它时,我认为你正在传递df_rdd。但这已经是一个DataFrame。此DataFrame的每一行都是Row类型,如果您拨打df_rdd.first(),则会获得Row(uid=1, address_uid=u'a')。您在myFunc中所做的是尝试使用split,但split用于字符串对象,并且您有Row个对象。我不确定为什么这不会引发错误,但你根本无法在split对象上调用Row。考虑一下r = df_rdd.map(lambda x: x[0])
    2. 的更多内容

      所以,我认为r.count()不起作用,因为当你致电myFunc时,某些事情变得混乱。

      旁注:

      df_rdd = ParallelBuild().run().map(lambda line: line).persist()。运行.map(lambda line: line)没有做任何事情。您没有对line进行任何更改,因此请勿运行map作业。代码为df_rdd = ParallelBuild().run().persist()