按列排列的 Spark Dataframe 笛卡尔积

Spark Dataframe cartesion product by columns

有什么方法可以在 Spark 中进行列式笛卡尔连接吗?

例如,给定一个数据框

+------+------+------+
|col_a |col_b |col_c |
+------+------+------+
|0     |10    |100   |
|0     |20    |200   |
|0     |30    |300   |
|0     |40    |400   |
+------+------+------+

结果是一组dataframes

+------+------+
|col_a |col_b |
+------+------+
|0     |10    |
|0     |20    |
|0     |30    |
|0     |40    |
+------+------+

+------+------+
|col_a |col_c |
+------+------+
|0     |100   |
|0     |200   |
|0     |300   |
|0     |400   |
+------+------+

+------+------+
|col_b |col_c |
+------+------+
|10    |100   |
|20    |200   |
|30    |300   |
|40    |400   |
+------+------+

我知道它可以在代码中完成(通过创建列名元组列表并通过迭代进行选择),但我想通过在所有他们,即。类似于 groupby().apply() 的东西。这可能吗?

我正在使用 Spark 3.1.1 和 pyspark

谢谢

您的问题与Spark并行无关。它不是笛卡尔积,它只是列的组合。
select 是一个简单的 spark 转换,它会立即执行,你只需要 python 即可:

from itertools import combinations


df_list = [df.select(*cols) for cols in combinations(df.columns, 2)]

结果是:

df_list 
[DataFrame[col_a: bigint, col_b: bigint],
 DataFrame[col_a: bigint, col_c: bigint],
 DataFrame[col_b: bigint, col_c: bigint]]