PySpark создает непересекающиеся рамки данных - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в использовании 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 и больший_чанк, а затем выбрать строки, в которых 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 должны быть непересекающимися, и это должно привести к пустому фрейму данных!

Любые идеи о том, что я делаю неправильно, или любое понимание того, что здесь происходит, было бы очень полезно !!!

Спасибо!

...