PySpark制作不相交的数据帧

时间:2018-10-23 18:44:07

标签: python apache-spark dataframe pyspark apache-spark-sql

我是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_chunksmaller_chunk应该是不相交的,这将导致一个空的数据框!

任何关于我在做什么错的想法,或者对这里正在发生的事情有任何了解,都将非常有帮助!

谢谢!

0 个答案:

没有答案