从 groupby 和已知序列向量创建 Spark 数据帧

Create Spark dataframe from groupby and known sequence vector

我有以下数据框

| Col1 | Col2 | Value  |
|------|------|--------|
| Key1 | Key2 | 45.0   |
| Key2 | Key2 | 34.0   |
| Key2 | Key3 | 121.0  |

我有值序列[1,2,3]。我想生成以下数据框

| Col1 | Col2 | Value  |
|------|------|--------|
| Key1 | Key2 |  1     |
| Key1 | Key2 |  2     |
| Key1 | Key2 |  3     |
| Key2 | Key2 |  1     |
| Key2 | Key2 |  2     |
| Key2 | Key2 |  3     |
| Key2 | Key3 |  1     |
| Key2 | Key3 |  2     |
| Key2 | Key3 |  3     |

(Col1,Col2) 对是从 groupBy 生成的,在我的新数据框中,我希望 GroupBy 返回的每一对重复三次,一次针对序列的每个值。然后,我将使用 (Col1,Col2,Value) 的组合将该数据框与另一个数据框左连接。

我想到的一个解决方案可能是采用三个不同数据帧的并集,每个数据帧的行包含不同的 (Col1,Col2) 和给定的序列值,即

df.groupBy(['Col1','Col2']).agg(F.lit(1).alias('Value')).union(df.groupBy(['Col1','Col2']).agg(F.lit(2).alias('Value')))

我想找到一个更优雅的解决方案,因为这个看起来与我在 SQL 中所做的非常相似。

只需创建一个文字数组列并将其展开:

from pyspark.sql import functions as F

df = spark.createDataFrame([
    ("Key1", "Key2", 45.0), ("Key2", "Key2", 34.0),
    ("Key2", "Key3", 121.0)], ("Col1", "Col2", "Value"))

values = [1, 2, 3]
df1 = df.withColumn("Value", F.explode(F.array(*[F.lit(x) for x in values])))

df1.show()
#+----+----+-----+
#|Col1|Col2|Value|
#+----+----+-----+
#|Key1|Key2|    1|
#|Key1|Key2|    2|
#|Key1|Key2|    3|
#|Key2|Key2|    1|
#|Key2|Key2|    2|
#|Key2|Key2|    3|
#|Key2|Key3|    1|
#|Key2|Key3|    2|
#|Key2|Key3|    3|
#+----+----+-----+