按列排列的 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]]
有什么方法可以在 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]]