如何从 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 一次只能接受一个行项目。 您可以使用foreachforeachPartition。 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 中检索值?

如何从熊猫数据框中的当前行中减去前一行并将其应用于每一行;不使用循环?

如何从 DataFrame 中获取最后一行?

如何根据部分匹配选择 DataFrame 列?

将 Spark Dataframe 中的每一行保存到不同的文件中

如何在 Pandas DataFrame 上编写条件数组操作