代码的目的是根据" 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()
答案 0 :(得分:0)
好的,所以你的主要问题是“为什么没有印刷?”答案分为两部分。
print
。因此,您的函数myFunc
不会向驱动程序打印任何内容。这样做的原因相当复杂,因此我将引导您this page以获取有关为什么打印在Spark中不起作用的更多信息。 但是,调用r.count()
应打印出9
。为什么不起作用?
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])
。所以,我认为r.count()
不起作用,因为当你致电myFunc
时,某些事情变得混乱。
旁注:
df_rdd = ParallelBuild().run().map(lambda line: line).persist()
。运行.map(lambda line: line)
没有做任何事情。您没有对line
进行任何更改,因此请勿运行map
作业。代码为df_rdd = ParallelBuild().run().persist()