2016-03-19 56 views
2

我有這兩個dataframes:Pyspark:從不同的表乘以列

df1 = sc.parallelize([ 
['u1', 0.5], 
['u2', 0.2], 
['u3', 0.1], 
['u4', 0.9], 
['u5', 0.7] 
]).toDF(('person', 'score')) 

df2 = sc.parallelize([ 
['d1', 0.0], 
['d2', 0.5], 
['d3', 0.7], 
]).toDF(('dog', 'score')) 

我需要做的是創建另一個數據幀,其模式將

人,狗,score_person * score_dog

所以基本上乘以兩個數據幀中的列score並保留兩個第一列。這種乘法必須針對每個可能的幾個因素進行,即每個人與每隻狗,以便我的結果數據框將有15行。

我找不到方法來獲得這個,在我看來,它必須通過兩個數據框上的SELECT,但沒有JOIN和UNION可以幫助。

回答

4

通常笛卡爾乘積是要避免的,但一些簡單join沒有on參數是所有你需要在這裏:

df1.join(df2).select("person", "dog", (df1.score * df2.score).alias("product")) 
+0

看起來宏大,任何理由,我得到這樣的事情,雖然:行(人= U」 u1',dog = u'd2',product = None)(無)?結果中有幾個,其他一些是0.它是類型的問題嗎? –

+0

是的。 'type(0)'(我糾正的部分)是'int',而'type(0.5)'是'float'。 Spark'DataFrame'只能包含單個類型(第一個值用於確定模式),所有其他值將被丟棄。你可以在'join'之前檢查它。 – zero323