[英]PySpark Access DataFrame columns at foreachPartition() custom function
[英]Getting empty dataframe after foreachPartition execution in Pyspark
我是 PySpark 的新手,我正在尝试在我的数据帧中执行 foreachPartition 函数,然后我想使用相同的数据帧执行另一个函数。 问题是在使用 foreachPartition 函数后,我的数据框变空了,所以我无法用它做任何其他事情。 我的代码如下所示:
def my_random_function(partition, parameters):
#performs something with the dataframe
#does not return anything
my_py_spark_dataframe.foreachPartition(
lambda partition: my_random_function(partition, parameters))
有人能告诉我如何执行这个 foreachPartition 并使用相同的数据框来执行其他功能吗?
我看到一些用户谈论使用 df.toPandas().copy() 复制数据框,但在我的例子中,这会导致一些执行问题,所以我想使用相同的数据框而不是创建一个新的数据框。
先感谢您!
不清楚您正在尝试哪种操作; 但这是foreachPartition的示例用法:
示例数据是来自三大洲的国家/地区列表:
+---------+-------+
|Continent|Country|
+---------+-------+
| NA| USA|
| NA| Canada|
| NA| Mexico|
| EU|England|
| EU| France|
| EU|Germany|
| ASIA| India|
| ASIA| China|
| ASIA| Japan|
+---------+-------+
以下代码按“Continent”对数据进行分区,使用foreachPartition
迭代每个分区,并将“Country”名称写入该特定分区的每个文件,即 continent。
df = spark.createDataFrame(data=[["NA", "USA"], ["NA", "Canada"], ["NA", "Mexico"], ["EU", "England"], ["EU", "France"], ["EU", "Germany"], ["ASIA", "India"], ["ASIA", "China"], ["ASIA", "Japan"]], schema=["Continent", "Country"])
df.withColumn("partition_id", F.spark_partition_id()).show()
df = df.repartition(F.col("Continent"))
df.withColumn("partition_id", F.spark_partition_id()).show()
def write_to_file(rows):
for row in rows:
with open(f"/content/sample_data/{row.Continent}.txt", "a+") as f:
f.write(f"{row.Country}\n")
df.foreachPartition(write_to_file)
输出:
三个文件:每个分区一个。
!ls -1 /content/sample_data/
ASIA.txt
EU.txt
NA.txt
每个文件都有该大陆(分区)的国家名称:
!cat /content/sample_data/ASIA.txt
India
China
Japan
!cat /content/sample_data/EU.txt
England
France
Germany
!cat /content/sample_data/NA.txt
USA
Canada
Mexico
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.