Apache spark 如何在限制行数的同时拆分Pyspark数据帧?

Apache spark 如何在限制行数的同时拆分Pyspark数据帧?,apache-spark,pyspark,Apache Spark,Pyspark,我正在将数据从数据帧发送到限制为50000行的API。假设我的数据帧有70000行,如何将其拆分为单独的数据帧,每个数据帧的最大行数为50000?这些不必是均匀的,数据顺序也不重要。解决方法是使用.limit()函数。您可以这样做:假设70k行的主df是原始的。所以你可以这样做 limited_df = df.limit(50000) 这是第一次获得50k行,下一行您可以这样做 original_df.subtract(limited_df) 您将获得剩余的行。如果需要,还可以对减去的df执

我正在将数据从数据帧发送到限制为50000行的API。假设我的数据帧有70000行,如何将其拆分为单独的数据帧,每个数据帧的最大行数为50000?这些不必是均匀的,数据顺序也不重要。

解决方法是使用
.limit()
函数。您可以这样做:假设70k行的主df是原始的。所以你可以这样做

limited_df = df.limit(50000)
这是第一次获得50k行,下一行您可以这样做

original_df.subtract(limited_df)
您将获得剩余的行。如果需要,还可以对减去的df执行.limit()

更新:
您可以对dataframe中存在的任意数量的行执行此操作。假设在某一点上,如果您的数据帧有30000行,并且您执行了df.limit(50000),那么它不会抛出任何错误,只会返回数据帧中的30k行。

您可以通过使用行数,然后每50000行进行拆分来实现以下目的

#order by any column to populate the row number
window=Window.orderBy('ID')
length=df1.count()
df2=df1.withColumn('row',f.row_number().over(window))

step=50000
for i in range(1,length,step):
    df3 = df2.filter((f.col('row')>=i) & (f.col('row')<=i+step-1))
    #Here perform your API call as it will contain only 50000 rows at one time 

#按任何列排序以填充行号
window=window.orderBy('ID'))
长度=df1.count()
df2=df1.withColumn('row',f.row_number()。在(窗口)上方)
步长=50000
对于范围内的i(1,长度,步长):

df3=df2.filter((f.col('row')>=i)和(f.col('row'))u可以使用
df.count
作为条件,如果大于50k则使用
randomspilt
函数。类似
def split(df):如果df.count()>50000:df1,df2=df.randomspilt([0.5,0.5],24)return df1,df2 else:return df
Josh,您可能会发现您的答案@Josh更好的解决方案是在数据帧上利用
foreachPartition
方法,这样您就可以控制每个分区的确切行数,并按照前面的要求将数据直接发送到APIis可以使用
.limit()
函数。您可以这样做:假设您的70k行主df为原始df。因此您可以像
limited\u df=df.limit(50000)
第一次获得50k行,接下来的行可以执行
original\u df.subtract(limited\u df)
您将获得剩余的行。如果需要,您甚至可以对减去的df执行.limit()。