Pyspark - Как дублировать / дублировать строки? - PullRequest
1 голос
/ 04 мая 2020

Мне нужно «клонировать» или «дублировать» / «дублировать» каждую строку в моем фрейме данных.

Я ничего не нашел об этом, я просто знаю, что мне нужно использовать Explode.

Пример:

ID - Name
1     John
2     Maria
3     Charles

Вывод:

ID - Name
1     John
1     John
2     Maria
2     Maria
3     Charles
3     Charles

Спасибо

1 Ответ

3 голосов
/ 04 мая 2020

Вы можете использовать array_repeat с explode. (Spark2.4+)

Для duplicate:

from pyspark.sql import functions as F
df.withColumn("Name", F.explode(F.array_repeat("Name",2)))

Для triplicate:

df.withColumn("Name", F.explode(F.array_repeat("Name",3)))

For <spark2.4:

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

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

UPDATE:

Чтобы использовать другой столбец Support до replicate 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|
#+---+-------+-------+

Для 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...