我在spark中有一个数据框,如下所示
a b
( 21 , 23 )
( 23 , 21 )
( 22 , 21 )
( 21 , 22 )
我想要一个看起来像这样的数据框: -
( 21 , 22 )
( 21 , 23 )
( 22 , 21 )
( 22 , 23 )
( 23 , 21 )
( 23 , 22 )
因此,应考虑两列的所有可能组合。如何实现这一目标?
我尝试过笛卡尔加入,但是它花费了太多时间用于非常小的数据集。还有其他选择吗?
感谢。
答案 0 :(得分:0)
试
zip(*pairs_rdd).flatten.deduplicate.foreach(n => (n,n-1)).cache()
答案 1 :(得分:0)
很难说为什么join
是"花费太多时间"没有看到你的代码。我发现以下方法对我来说工作起来相当快:
df = sqlContext.createDataFrame(
[
Row(a=21, b=22),
Row(a=22, b=23),
]
)
# rename to avoid identical colume names in the result
df_copy = df.alias('df_copy')
df_copy = df_copy.withColumnRenamed('a', 'a_copy')
df_copy = df_copy.withColumnRenamed('b', 'b_copy')
df.join(df_copy, how='outer').select(df.a, df_copy.b_copy).collect()