我试图在并行代码中使用“apply”,但是“apply”根本不起作用。在使用Spark(RDD上的并行化)时,我们可以在分发给执行者的代码中使用“apply”吗?你知道吗
代码:
def testApply(k):
return pd.DataFrame({'col1':k,'col2':[k*2]*5})
def testExec(x):
df=pd.DataFrame({'col1':range(0,10)})
ddf=pd.DataFrame(columns=['col1', 'col2'])
##In my case the below line doesn't get executed at all
res= df.apply(lambda row: testApply(row.pblkGroup) if row.pblkGroup%2==0 else pd.DataFrame(), axis=1)
list1=[1,2,3,4]
sc=SparkContext.getOrCreate()
testRdd= sc.parallelize(list1)
output=testRdd.map(lambda x: testExec(x)).collect()
使用熊猫内火花你有2选项:-你知道吗
使用闭包
Spark的一个困难之处是,在集群中执行代码时,要理解变量和方法的作用域和生命周期。RDD操作在变量的作用域之外修改变量,这常常会引起混淆。在下面的示例中,我们将查看使用foreach()递增计数器的代码,但其他操作也可能出现类似的问题。你知道吗
更多详情请参见[1]
示例
详情见[2]
使用自定义项
对于Spark 2.4.4,有一个现成的使用Spark的方法。细节可以在这里找到,还有例子[3]
1-http://spark.apache.org/docs/latest/rdd-programming-guide.html#understanding-closures- 2-Custom function over pyspark dataframe 3-https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html
版本低于0.21的熊猫似乎不支持此功能。我已经升级了熊猫版,效果很好。你知道吗
相关问题 更多 >
编程相关推荐