Pyspark - 如何复制/三次重复行?

tha*_*les 3 row explode pyspark

我需要“克隆”或“复制”/“三次复制”数据框中的每一行。

我什么也没找到,我只知道我需要使用爆炸。

例子:

ID - Name
1     John
2     Maria
3     Charles
Run Code Online (Sandbox Code Playgroud)

输出:

ID - Name
1     John
1     John
2     Maria
2     Maria
3     Charles
3     Charles
Run Code Online (Sandbox Code Playgroud)

谢谢

mur*_*ash 5

您可以array_repeat与 一起使用explode(Spark2.4+)

为了duplicate

from pyspark.sql import functions as F
df.withColumn("Name", F.explode(F.array_repeat("Name",2)))
Run Code Online (Sandbox Code Playgroud)

为了triplicate

df.withColumn("Name", F.explode(F.array_repeat("Name",3)))
Run Code Online (Sandbox Code Playgroud)

For <spark2.4:

#duplicate
df.withColumn("Name", F.explode(F.array(*[['Name']*2])))

#triplicate
df.withColumn("Name", F.explode(F.array(*[['Name']*3])))
Run Code Online (Sandbox Code Playgroud)

UPDATE:

为了使用另一列Supportreplicate a certain number of times for each row您可以使用它。(Spark2.4+)

df.show()

#+---+-------+-------+
#| ID|   Name|Support|
#+---+-------+-------+
#|  1|   John|      2|
#|  2|  Maria|      4|
#|  3|Charles|      6|
#+---+-------+-------+

from pyspark.sql import functions as F
df.withColumn("Name", F.explode(F.expr("""array_repeat(Name,int(Support))"""))).show()

#+---+-------+-------+
#| ID|   Name|Support|
#+---+-------+-------+
#|  1|   John|      2|
#|  1|   John|      2|
#|  2|  Maria|      4|
#|  2|  Maria|      4|
#|  2|  Maria|      4|
#|  2|  Maria|      4|
#|  3|Charles|      6|
#|  3|Charles|      6|
#|  3|Charles|      6|
#|  3|Charles|      6|
#|  3|Charles|      6|
#|  3|Charles|      6|
#+---+-------+-------+
Run Code Online (Sandbox Code Playgroud)

对于spark1.5+,使用repeat, concat, substring, split & explode.

from pyspark.sql import functions as F
df.withColumn("Name", F.expr("""repeat(concat(Name,','),Support)"""))\
  .withColumn("Name", F.explode(F.expr("""split(substring(Name,1,length(Name)-1),',')"""))).show()
Run Code Online (Sandbox Code Playgroud)