如何从数据框中获取 1000 条记录并使用 PySpark 写入文件?

     2023-04-15     175

关键词:

【中文标题】如何从数据框中获取 1000 条记录并使用 PySpark 写入文件?【英文标题】:How to get 1000 records from dataframe and write into a file using PySpark? 【发布时间】:2020-04-24 15:48:42 【问题描述】:

我在数据框中有 100,000 多条记录。我想动态创建一个文件并为每个文件推送 1000 条记录。谁能帮我解决这个问题,在此先感谢。

【问题讨论】:

【参考方案1】:

您可以在编写dataframe 时使用maxRecordsPerFile 选项。

如果您需要整个数据帧在每个文件中写入 1000 条记录,请使用repartition(1) (or)每个分区写入 1000 条记录使用 .coalesce(1)

Example:

# 1000 records written per file in each partition
df.coalesce(1).write.option("maxRecordsPerFile", 1000).mode("overwrite").parquet(<path>)

# 1000 records written per file for dataframe 100 files created for 100,000
df.repartition(1).write.option("maxRecordsPerFile", 1000).mode("overwrite").parquet(<path>)

#or by set config on spark session
spark.conf.set("spark.sql.files.maxRecordsPerFile", 1000)
#or
spark.sql("set spark.sql.files.maxRecordsPerFile=1000").show()

df.coalesce(1).write.mode("overwrite").parquet(<path>)
df.repartition(1).write.mode("overwrite").parquet(<path>)

Method-2:

Caluculating number of partitions then repartition the dataframe:

df = spark.range(10000)

#caluculate partitions
no_partitions=df.count()/1000

from pyspark.sql.functions import *

#repartition and check number of records on each partition
df.repartition(no_partitions).\
withColumn("partition_id",spark_partition_id()).\
groupBy(col("partition_id")).\
agg(count("*")).\
show()

#+-----------+--------+
#|partiton_id|count(1)|
#+-----------+--------+
#|          1|    1001|
#|          6|    1000|
#|          3|     999|
#|          5|    1000|
#|          9|    1000|
#|          4|     999|
#|          8|    1000|
#|          7|    1000|
#|          2|    1001|
#|          0|    1000|
#+-----------+--------+

df.repartition(no_partitions).write.mode("overwrite").parquet(<path>)

【讨论】:

我怎样才能给自定义文件名而不是自动生成? @tsuresh97,默认情况下我们不能在 spark 中使用control filenames,但只能指定 directory 名称,要更改文件名需要使用 hadoop.fs api 对于这种情况***.com/questions/41990086/… 非常感谢@Shu 我需要将数据帧的记录写入 json 文件。如果我将数据帧写入它存储的文件中,例如 "a":1 "b":2,我想像这样 ["a":1 ,"b":2 写入数据帧]。可以请@Shu。提前致谢。 @tsuresh97,请查看我的回答***.com/a/61425542/7632695【参考方案2】:

首先,创建一个行号列

df = df.withColumn('row_num', F.row_number().over(Window.orderBy('any_column'))

现在,运行一个循环并继续保存记录。

for i in range(0, df.count(), 1000):
   records = df.where(F.col("row_num").between(i, i+999))
   records.toPandas().to_csv("file-.csv".format(i))

【讨论】:

我需要将数据帧的记录写入 json 文件。如果我将数据帧写入它存储的文件中,例如 "a":1 "b":2,我想像这样 ["a":1 ,"b":2 写入数据帧]。你能帮我么。提前致谢。 @Prateek 耆那教 使用 pandas 我们也可以存储为 Json 格式,这正是您所需要的。因此,只需将 .to_csv 更改为 .to_json。有关详细信息,请参阅此链接 - pandas.pydata.org/pandas-docs/stable/reference/api/… 感谢@Prateek Jain

如何使用教义/symfony4 从数据库中获取(连接)两条记录

】如何使用教义/symfony4从数据库中获取(连接)两条记录【英文标题】:Howtofetch(join)tworecordsfromdatabaseusingdoctrine/symfony4【发布时间】:2019-02-0315:54:50【问题描述】:我正在学习Symfony和Doctrine并创建了一个简单的网站,但我被困在... 查看详情

如何获取超过1000?

】如何获取超过1000?【英文标题】:Howtofetchmorethan1000?【发布时间】:2010-09-2019:39:53【问题描述】:如何从数据存储中获取超过1000条记录并将所有记录放在一个列表中以传递给django?【问题讨论】:【参考方案1】:从版本1.3.6... 查看详情

如何获取数据列表,特定日期仅从每个日期获取 6 条记录而不是更多

】如何获取数据列表,特定日期仅从每个日期获取6条记录而不是更多【英文标题】:Howtogetlistofdata,particulardatewiseonly6recordgetfromeachdatenotmore【发布时间】:2020-08-0622:57:12【问题描述】:我在java中使用带有安全性的springboot。我尝... 查看详情

如何使用 C#/SQL 批量更新 1000 条记录

】如何使用C#/SQL批量更新1000条记录【英文标题】:Howtobulkupdate1000recordsusingC#/SQL【发布时间】:2021-11-2120:50:36【问题描述】:我正在从包含一百万条记录的表中读取数据,我对某些列进行了一些修改,我想将它们批量保存。我想... 查看详情

BigQuery - 获取 1000000 条记录并使用 goLang 对数据进行一些处理

】BigQuery-获取1000000条记录并使用goLang对数据进行一些处理【英文标题】:BigQuery-fetch1000000recordsanddosomeprocessoverdatausinggoLang【发布时间】:2019-05-2203:04:09【问题描述】:我在BigQuery中有1000000条记录。使用goLang从数据库中获取数据... 查看详情

如何从我的sqlserver获取我的数据库列表,并使用javafx将其添加到组合框中

我需要从SQLServer获取数据库列表,并在组合框中显示所有内容。组合框显示了来自SQLServer的数据库列表,因此我可以从组合框中选择需要打开的数据库。感谢您的帮助..我需要从SQLServer获取数据库列表,并在组合框中显示所有内... 查看详情

如何从雪花数据库中的表中删除前 N 条记录

】如何从雪花数据库中的表中删除前N条记录【英文标题】:HowtoDELETEtopNrecordsfromTableinSnowflakeDatabase【发布时间】:2020-08-2112:30:17【问题描述】:我想在SnowflakeDB中执行DELETE操作,有记录限制,我的要求是批量执行DELETE操作,比如... 查看详情

从数据库中获取前 10 条记录并从当前登录用户中获取记录

】从数据库中获取前10条记录并从当前登录用户中获取记录【英文标题】:Gettop10recordsfromdbandrecordfromcurrentloginuser【发布时间】:2013-06-1420:48:28【问题描述】:我有一个包含一些数据的表,只是我想显示该表中的前10个排名,在最... 查看详情

如何使用 sqlite 批量插入超过 1000 条记录?

】如何使用sqlite批量插入超过1000条记录?【英文标题】:Howtodobulkinsertforover1000recordsusingsqlite?【发布时间】:2010-08-1010:07:19【问题描述】:我正在尝试使用sqlite在数据库中插入11000条记录,但是尽管程序执行没有错误,但没有插... 查看详情

如何一次获取 100 条记录,直到使用 Spring JPA 的 oracle 中的所有记录?

】如何一次获取100条记录,直到使用SpringJPA的oracle中的所有记录?【英文标题】:Howtofetch100recordsatatimeuntilalltherecordsinoracleusingSpringJPA?【发布时间】:2019-02-1021:02:43【问题描述】:我想从Oracle读取100条记录并对这些数据进行一些... 查看详情

从组合框中获取数据并使用它来获取另一个组合框中的数据

】从组合框中获取数据并使用它来获取另一个组合框中的数据【英文标题】:GettingdatafromcomboBoxanduseittogetdatainonothercombobox【发布时间】:2019-10-0405:16:40【问题描述】:我的应用中有两个组合框。其中一个cmb1与一个名为Branches的表... 查看详情

从核心数据中获取所有记录并从每条记录中获取具有一个属性的字符串(MagicalRecord)

】从核心数据中获取所有记录并从每条记录中获取具有一个属性的字符串(MagicalRecord)【英文标题】:Getallrecordsfromcoredataandgetstringwithoneattributefromeveryrecord(MagicalRecord)【发布时间】:2013-08-1919:08:38【问题描述】:我试图获取用户... 查看详情

如何从 Sqlite 获取最后一条记录?

】如何从Sqlite获取最后一条记录?【英文标题】:HowtogetLastrecordfromSqlite?【发布时间】:2012-04-1117:50:17【问题描述】:我有一张桌子question_table和一张ImageButton(返回)。单击Back后,我需要从数据库中获取最后插入的记录。我的... 查看详情

如何从数字列表中获取所有可能的排列并存储在数据框中?

】如何从数字列表中获取所有可能的排列并存储在数据框中?【英文标题】:Howtogeteverypossiblepermutationfromalistofnumbersandstoreinadataframe?【发布时间】:2018-12-2101:32:17【问题描述】:我有一个数字列表,1-6,我需要所有可能的排列,... 查看详情

如何从 PySpark 中的数据框中获取模式定义?

】如何从PySpark中的数据框中获取模式定义?【英文标题】:HowtogettheschemadefinitionfromadataframeinPySpark?【发布时间】:2019-06-2710:02:59【问题描述】:在PySpark中,您可以定义模式并使用此预定义模式读取数据源,例如。g.:Schema=StructT... 查看详情

java示例代码_如何使用java中的单个结果集检查是否存在记录并从数据库中获取记录值

java示例代码_如何使用java中的单个结果集检查是否存在记录并从数据库中获取记录值 查看详情

SQL - 如何从一个表中获取重复记录并连接到另一张表

】SQL-如何从一个表中获取重复记录并连接到另一张表【英文标题】:SQL-Howtogetduplicaterecordsfromonetablewithjoinonanothertable【发布时间】:2018-04-1302:19:06【问题描述】:我想从Table1中获取记录,其中它有多个相同访问号的记录,但同时... 查看详情

尝试使用外键从组合框中获取数据并更新数据库

】尝试使用外键从组合框中获取数据并更新数据库【英文标题】:Tryingtotakedatafromacomboboxwithaforeignkeyandupdatethedatabase【发布时间】:2021-02-2100:18:37【问题描述】:我正在尝试使用提供的代码更新我的SQL数据库,我基本上是在尝试... 查看详情