pyspark - Pyspark - 如何复制/三重行?
问题描述
我需要从我的数据框中“克隆”或“复制”/“三重复制”每一行。
我没有找到任何关于它的东西,我只知道我需要使用爆炸。
例子:
ID - Name
1 John
2 Maria
3 Charles
输出:
ID - Name
1 John
1 John
2 Maria
2 Maria
3 Charles
3 Charles
谢谢
解决方案
你可以使用array_repeat
with 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()
推荐阅读
- android - Android Wear 断开连接指示器
- azure - 在 Azure 自动化或 ADF 自定义活动中运行 Powershell 脚本?
- python - python中上下文包的导入错误
- c# - 如何配置在控制台应用程序中使用两个不同数据库的hangfire?
- sql - 当数组长度为非静态时,PostgreSQL 中的数组到列
- angular - ow 保持 keyup 方法直到输入 3 个 angular 字母
- angular - 在特定按钮上单击在 ionic 3 中添加一个类
- neo4j - neo4j 3.5.x GC 一遍又一遍地运行,即使在刚刚启动服务器之后也是如此
- r - 如何在 R 中使用 quanteda 获取基本的可读性统计信息
- ssis - 如何摆脱 SSMS 中 SSIS 包中的 CreationName 错误?