2016-03-19 53 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