我有这两个数据帧:
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也无法提供帮助。
答案 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