如何从 DataFrame 中保存一行
Posted
技术标签:
【中文标题】如何从 DataFrame 中保存一行【英文标题】:How to save one row from DataFrame 【发布时间】:2022-01-18 17:49:32 【问题描述】:我在从 DataFrame 逐行写入输出时遇到问题。我写了自己的解决方案,但是太慢了,所以也许有一个内置的解决方案来解决这个问题。
目标是将数据帧的行分别写入输出。 我的代码:
window = Window.partitionBy(col1).orderBy(col2)
df = df.withColumn("nb", f.row_number().over(window))
for i in range(df.count()):
(df
.where(f"nb = i+1")
.drop("nb")
.select(f.to_json(f.struct([df[x] for x in df.columns])).alias("value"))
.write
.format("console")
.save())
是否有可能使这更快? 提前致谢!
【问题讨论】:
你想要达到什么目的? 它很慢,因为您使用的是循环。如果你想要一个索引,那不是这样做的方法。另外,您要删除列,那么 nb 列的目的是什么,或者让每个列都是单独打印的 DF? @OneCricketeer 是的,我知道这是因为循环。我需要将行从数据帧(遥测数据)发送到其他系统。这就是为什么我需要一一发送(系统需要)。那么我如何使用 spark 实用程序实现这一目标? @Łukasz 确认一下,您需要一次发送一个,还是发送到一次只接受一个数据项的 API? @Nithish,是的,我一次只需要发送一行,API 一次只接受一行。 【参考方案1】:因为您使用的 API 一次只能接受一个行项目。
您可以使用foreach
或foreachPartition
。 This answer 很好地概述了它们之间的差异。
您还可以重新分区数据帧以控制建立的并行连接数。
from pyspark.sql import functions as f
data = [("James","","Smith","36636","M",3000),
("Michael","Rose","","40288","M",4000),
("Robert","","Williams","42114","M",4000),
("Maria","Anne","Jones","39192","F",4000),
("Jen","Mary","Brown","","F",-1)
]
df = spark.createDataFrame(data, ("firstname", "middlename", "lastname", "id", "gender", "salary", ))
def mimic_send_to_api(iterator):
# mimic intitiate costly session with API
session = print
for item in iterator:
session(f"sent to API: item.value")
df.select(f.to_json(f.struct([df[x] for x in df.columns])).alias("value"))\
.foreachPartition(mimic_send_to_api)
输出
sent to API: "firstname":"James","middlename":"","lastname":"Smith","id":"36636","gender":"M","salary":3000
sent to API: "firstname":"Michael","middlename":"Rose","lastname":"","id":"40288","gender":"M","salary":4000
sent to API: "firstname":"Robert","middlename":"","lastname":"Williams","id":"42114","gender":"M","salary":4000
sent to API: "firstname":"Maria","middlename":"Anne","lastname":"Jones","id":"39192","gender":"F","salary":4000
sent to API: "firstname":"Jen","middlename":"Mary","lastname":"Brown","id":"","gender":"F","salary":-1
【讨论】:
以上是关于如何从 DataFrame 中保存一行的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:如何从给定(行,列)对列表的 DataFrame 中检索值?
如何从熊猫数据框中的当前行中减去前一行并将其应用于每一行;不使用循环?