我是PySpark的新手,我想做的是将一个具有单列的数据框(可能有重复的行)拆分为两个数据框,以使80%的不同行以一个数据帧结尾,而20%则以另一数据帧结尾。假设将大数据框称为big_df
,其列为id
。为此,我正在执行的操作顺序如下:
big_df = big_df.select('id').distinct() # Get all the distinct ids
bigger_chunk = big_df.sample(withReplacement=False, fraction=0.8) # Get approximately 80%
smaller_chunk = big_df.join(bigger_chunk,
[big_df.id == bigger_chunk.id],
how = 'left_outer')
因此,这里的想法是在big_df和big_chunk之间进行左连接,然后选择bigger_chunk.id IS NULL
所在的行。由于此处的连接会导致一个具有两个具有相同名称的列的数据框,所以我这样做:
cols = ['big_df_id', 'bigger_chunk_id']
smaller_chunk = smaller_chunk.toDF(*cols)
smaller_chunk = smaller_chunk.where(smaller_chunk.bigger_chunk_id.isNull()).
select(smaller_chunk.big_df_id).toDF('id')
在此之后,我进行了一次健全性检查以查看它是否确实有效:
print (bigger_chunk.count()+smaller_chunk.count() == big_df.count())
>>>> True
但是当我这样做
bigger_chunk.select('id').intersect(smaller_chunk.select('id')).show()
我得到一个没有意义的非空数据框,因为bigger_chunk
和smaller_chunk
应该是不相交的,这将导致一个空的数据框!
任何关于我在做什么错的想法,或者对这里正在发生的事情有任何了解,都将非常有帮助!
谢谢!