Рандомизация Dataframe или RDD для тренировки ML в Spark [дубликат]

Закон большой тройки такой, как указано выше.

Легкий пример на простом английском языке той проблемы, которую он решает:

Неисправный деструктор

]

Вы выделили память в своем конструкторе, и вам нужно написать деструктор, чтобы удалить его. В противном случае произойдет утечка памяти.

Вы можете подумать, что это работа.

Проблема будет, если копия сделана из вашего объекта, то копия укажет на ту же память, что и на исходный объект.

Однажды один из них удаляет память в своем деструкторе другой будет иметь указатель на недопустимую память (это называется обвисший указатель), когда он пытается использовать его, все будет выглядеть волосатым.

Поэтому вы пишете конструктор копирования, чтобы он выделяет новые объекты для уничтожения своих собственных фрагментов памяти.

Оператор присваивания и конструктор копирования

Вы выделили память в своем конструкторе указателю участника вашего класса. Когда вы копируете объект этого класса, оператор присваивания по умолчанию и конструктор копирования копируют значение этого элемента-указателя на новый объект.

Это означает, что новый объект и старый объект будут указывать на тот же кусок памяти, поэтому, когда вы меняете его на один объект, он будет изменен и для другого объекта objerct. Если один объект удаляет эту память, другой будет продолжать пытаться ее использовать - eek.

Чтобы решить эту проблему, вы пишете собственную версию конструктора копирования и оператора присваивания. Ваши версии выделяют отдельную память новым объектам и копируют значения, на которые указывает первый указатель, а не его адрес.

1
задан harshit 22 April 2016 в 20:44
поделиться

1 ответ

Он работает в Pandas, потому что выборки в локальных системах обычно решаются путем перетасовки данных. Spark, с другой стороны, избегает перетасовки, выполняя линейные сканирование по данным. Это означает, что выборка в Spark только рандомизирует членов выборки, а не порядок.

Вы можете заказать DataFrame столбец случайных чисел:

from pyspark.sql.functions import rand 

df = sc.parallelize(range(20)).map(lambda x: (x, )).toDF(["x"])
df.orderBy(rand()).show(3)

## +---+
## |  x|
## +---+
## |  2|
## |  7|
## | 14|
## +---+
## only showing top 3 rows

, но это:

  • дорогой - потому что он требует полного перетасовки, и это то, что вы обычно хотите избежать.
  • подозрительно - потому что порядок значений в DataFrame не является чем-то, что вы действительно можете зависят от нетривиальных случаев, и поскольку DataFrame не поддерживает индексацию, он бесполезен без сбора.
5
ответ дан zero323 25 August 2018 в 09:58
поделиться