Как случайное число ведет себя в искре - PullRequest
1 голос
/ 08 апреля 2020

Какая польза от rand (INT) и что происходит, когда мы умножаем другое число на результат rand (INT) * 10 или rand (INT) * 12

Какую пользу мы получим, если мы умножить некоторое число на rand (INT)

Похоже, что оно производит распределенное число в соответствии с числом, которое мы используем для умножения. В моем случае это 19. Если мы даем 19, то все наши случайные числа никогда не выходят за пределы 19. Это так?

Также упоминается, что rand(seed) производит вывод детерминистическим c способом. Что это значит, и почему значение в моем наборе данных действительно меняется?

scala> val df = hc.sql("""select 8 , rand(123456), rand(123456)*19, floor(rand(123456)*19) as random_number ,rand(1)  from v-vb.omega """)
df: org.apache.spark.sql.DataFrame = [_c0: int, _c1: double, _c2: double, random_number: bigint, _c4: double]

scala> df.show(100,false)
 +---+--------------------+-------------------+-------------+--------------------+
 |_c0|_c1                 |_c2                |random_number|_c4                 |
 +---+--------------------+-------------------+-------------+--------------------+
 |8  |0.4953081723589211  |9.4108552748195    |9            |0.13385709732307427 |
|8  |0.8134447122366524  |15.455449532496395 |15           |0.5897562959687032  |
 |8  |0.37061329883387006 |7.0416526778435315 |7            |0.01540012100242305 |
 |8  |0.039605242829950704|0.7524996137690634 |0            |0.22569943461197162 |
 |8  |0.6789785261613072  |12.900591997064836 |12           |0.9207602095112212  |
 |8  |0.9696879210080743  |18.424070499153412 |18           |0.6222816020094926  |
 |8  |0.773136636564404   |14.689596094723676 |14           |0.1029837279488438  |
 |8  |0.7990411192888535  |15.181781266488215 |15           |0.6678762139023474  |
 |8  |0.8089896546054375  |15.370803437503312 |15           |0.06748208566157787 |
 |8  |0.0895536147884225  |1.7015186809800276 |1            |0.5215181769983375  |
 |8  |0.7385237395885733  |14.031951052182894 |14           |0.8895645473999635  |
|8  |0.059503458368902584|1.130565709009149  |1            |0.321509746474296   |
|8  |0.14662556746599353 |2.785885781853877  |2            |0.28823975483307396 |
|8  |0.28066416785509374 |5.332619189246781  |5            |0.45999786693699807 |
|8  |0.5563531082651644  |10.570709057038123 |10           |0.17320175842535657 |
|8  |0.6619862377687996  |12.577738517607193 |12           |1.152006730106292E-4|
|8  |0.9090845495301373  |17.272606441072607 |17           |0.7500451351287378  |

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

В Spark rand(seed) и randn(seed) не являются детерминированными c, что является неразрешенной ошибкой. Соответствующая заметка была добавлена ​​в исходный код через JIRA SPARK-13380 :

  /**
   * Generate a random column with independent and identically distributed (i.i.d.) samples
   * from U[0.0, 1.0].
   *
   * @note The function is non-deterministic in general case.
   *
   * @group normal_funcs
   * @since 1.4.0
   */
  def rand(seed: Long): Column = withExpr { Rand(seed) }
1 голос
/ 09 апреля 2020

Deterministi c означает, что результат функции всегда одинаков для одного и того же аргумента (различные вызовы функции с одним и тем же аргументом приводят к одному и тому же результату).

В вашем наборе данных это точно не определено c, потому что есть разные случайные числа, полученные с одним и тем же аргументом seed. Если в документации указано, что она должна быть детерминированной c, то это ошибка в документации или ошибка в реализации функции.

Другой вопрос: почему rand(12345)*19 никогда не превышает 19? Это потому, что значения рандов> 0 и <1. Это, я думаю, согласно спецификации </p>

...