【问题标题】:Pyspark - How to duplicate/triplicate rows?Pyspark - 如何复制/三重行?
【发布时间】:2020-08-19 07:36:32
【问题描述】:

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

什么都没找到,只知道需要用explode。

例子:

ID - Name
1     John
2     Maria
3     Charles

输出:

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

谢谢

【问题讨论】:

  • 你为什么不union数据框本身呢?

标签: pyspark row explode


【解决方案1】:

您可以将 array_repeatexplode 一起使用。(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:

要使用另一列 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|
#+---+-------+-------+

对于 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()

【讨论】:

  • 嘿@Mohammad,你知道是否可以在给定条件下乘以行数,例如有一个数字为 2、4、6 的支撑列,我想相应地爆炸到这些数字
  • 你的 spark 版本是什么?并支持2、4、6含义的列,复制2次、4次、6次对吗?
  • 意思是我不能修复这个参数 2,4,6 它应该是像 df.withColumn("Name", F.explode(F.array_repeat("Name" ,F.col('参数')))
  • @thalesthales 你检查我的更新了吗?保持它动态的唯一方法是使用表达式,并发送参数的 int 值,如 df.withColumn("Name", F.explode(F.expr("""array_repeat(Name,int(parameter))""")))
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多