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