pyspark从列表中添加一列重复值

7cjasjjr  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(335)

我有一个pysparkDataframe,想添加一个列,以重复的方式从列表中添加值。如果这只是python,我可能会使用itertools的cycle函数。我不知道在Pypark怎么做。

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

我的Dataframe如下所示:

+-----+------+
| 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|
+-----+------+--------+
bhmjp9jg

bhmjp9jg1#

这里有一条路。
1-为Dataframe添加唯一的增量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-从名称列表创建Dataframe:

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|

# +----+-----+-----+

相关问题