Pyspark:将不同表格中的列相乘

时间:2016-03-19 16:39:02

标签: python sql apache-spark dataframe 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'))

我需要做的是创建另一个架构为

的数据帧
  

person,dog,score_person * score_dog

所以基本上将两个数据帧中的列score相乘并保留两个第一列。这种乘法必须针对每一个可能的因素进行,即每个人都有一只狗,这样我的结果数据帧就会有15行。

我找不到获取此方法的方法,在我看来,它必须在两个数据帧上都通过SELECT,但是没有JOIN,UNION也无法提供帮助。

2 个答案:

答案 0 :(得分:6)

通常情况下,笛卡尔产品是您要避免的产品,但在此处您只需要join简单的on参数:

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

答案 1 :(得分:1)

这个问题看起来已经有好几年了,但是发现在版本2.1中添加了显式的Cross Join方法。试试:

df1.crossJoin(df2).select("person", "dog", (df1.score * df2.score).alias("product"))

在此处找到信息:http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.crossJoin