2017-08-30 113 views
2

當使用numpy函數代替數學函數時,爲什麼pyspark表現不同? 例如pyspark中數學和numpy函數之間的區別

X = sc.parallelize([[DenseVector([4.9, 3.0, 1.4, 0.2]), DenseVector([4.6, 3.1, 1.5, 0.2])],[DenseVector([5.1, 3.5, 1.4, 0.3]), DenseVector([5.7, 3.8, 1.7, 0.3])]]) 
X_df = sqlcontext.createDataFrame(X, ["x","y"]) 
udf_foo = udf(lambda x, y: m.exp(-x.squared_distance(y)/2.0), DoubleType()) 
X_sim = X_df.withColumn("sim", udf_foo(X_df.x, X_df.y)) 

X_sim.show() 

輸出

+-----------------+-----------------+------------------+ 
|    x|    y|    sim| 
+-----------------+-----------------+------------------+ 
|[4.9,3.0,1.4,0.2]|[4.6,3.1,1.5,0.2]|0.9464851479534836| 
|[5.1,3.5,1.4,0.3]|[5.7,3.8,1.7,0.3]|0.7633794943368529| 
+-----------------+-----------------+------------------+ 

而代碼下面

udf_foonp = udf(lambda x, y: np.exp(-x.squared_distance(y)/2.0), DoubleType()) 
X_simnp = X_df.withColumn("sim", udf_foonp(X_df.x, X_df.y)) 

X_simnp.show() 

給出錯誤

expected zero arguments for construction of ClassDict 

回答

1

由於返回類型是不同的:

type(np.exp(1.0)) 
## numpy.float64 

type(math.exp(1.0)) 
## float 

和NumPy的類型不能爲SQL類型的合法的外部表現。因此你必須演員:

udf(lambda x, y: float(np.exp(-x.squared_distance(y)/2.0)), DoubleType()) 
相關問題