Pyspark从列表中添加重复值的列



我有一个pyspark数据框架,想要添加一个列,以重复的方式从列表中添加值。如果这只是python,我可能会使用itertools的循环函数。我不知道如何在pyspark中这样做。

names = ['Julia', 'Tim', 'Zoe']

我的数据框架是这样的:

+-----+------+
| id_A| idx_B|
+-----+------+
|    a|     0|       
|    b|     0|    
|    b|     2|       
|    b|     2|       
|    b|     2|       
|    b|     2|      
+-----+------+

我想让它看起来像这样:

+-----+------+--------+
| id_A| idx_B| names  |
+-----+------+--------+
|    a|     0|   Julia|
|    b|     0|     Tim|
|    b|     2|     Zoe|
|    b|     2|   Julia|
|    b|     2|     Tim|
|    b|     2|     Zoe|
+-----+------+--------+

有一个办法。

1 -为你的数据框架添加一个唯一的增量id:

df = spark.createDataFrame(
df.rdd.zipWithIndex().map(lambda x: Row(*x[0], x[1]))
).toDF("id_A", "idx_B", "id")
df.show()
#+----+-----+---+
#|id_A|idx_B| id|
#+----+-----+---+
#|   a|    0|  0|
#|   b|    0|  1|
#|   b|    2|  2|
#|   b|    2|  3|
#|   b|    2|  4|
#|   b|    2|  5|
#+----+-----+---+

2 -从名称列表中创建数据框架:

names_df = spark.createDataFrame([(idx, name) for idx, name in enumerate(names)], ["name_id", "names"])

3 -连接使用模3(名字列表的长度)在条件:

from pyspark.sql import functions as F
result = df.join(
names_df,
F.col("id") % 3 == F.col("name_id")
).orderBy("id").drop("id", "name_id")
result.show()
#+----+-----+-----+
#|id_A|idx_B|names|
#+----+-----+-----+
#|   a|    0|Julia|
#|   b|    0|  Tim|
#|   b|    2|  Zoe|
#|   b|    2|Julia|
#|   b|    2|  Tim|
#|   b|    2|  Zoe|
#+----+-----+-----+

最新更新