大Pandas不在里面工作

2024-09-29 19:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在并行代码中使用“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()




Tags: lambda代码dataframedfdefcol2col1row
2条回答

使用熊猫内火花你有2选项:-你知道吗

使用闭包

Spark的一个困难之处是,在集群中执行代码时,要理解变量和方法的作用域和生命周期。RDD操作在变量的作用域之外修改变量,这常常会引起混淆。在下面的示例中,我们将查看使用foreach()递增计数器的代码,但其他操作也可能出现类似的问题。你知道吗

更多详情请参见[1]

示例

import numpy as np
from pyspark.sql.types import FloatType
import pyspark.sql.functions as F

spk_df = sqlContext.createDataFrame([[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,1],[1,1,0,0]], ['t1', 't2', 't3', 't4'])
spk_df.show()

B = [2,0,1,0] 
V = [5,1,2,4]

def V_sum(row,b,c):
    return float(np.sum(c[row==b]))

v_sum_udf = F.udf(lambda row: V_sum(row, B, V), FloatType())    
spk_df.withColumn("results", v_sum_udf(F.array(*(F.col(x) for x in spk_df.columns))))

详情见[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的熊猫似乎不支持此功能。我已经升级了熊猫版,效果很好。你知道吗

相关问题 更多 >

    热门问题