Вставка случайных значений из списка в столбец фрейма данных Spark

#java #apache-spark

#java #apache-spark

Вопрос:

Я хотел бы вставить некоторые случайные значения в столбец dataset для целей тестирования.

 List<String> randValues = Arrays.asList("bla","foo","bar","yo")
Random rand = java.util.Random();
df.withColumn("testColumn", randValues.get(rand.nextInt(list.size())));
  

Я думал, что это сработает, но список фактически выбирает только одно значение, и оно будет присвоено как значение для всего столбца.
UDF также не является опцией, потому что UDF получает в качестве аргумента имя другого столбца для сбора значений, в то время как мои значения поступают из списка, а не из столбца.
Есть идеи?

Ответ №1:

Я использовал пример в scala, но это могло быть достигнуто на java org.apache.spark.sql.functions . Я сопоставил String значения массива с Column использованием lit функции, а затем преобразовал их в массив spark благодаря array функции (эта функция ожидает varargs def array(cols: Column*): Column , поэтому я использовал :_* для передачи каждого элемента массива в качестве одного аргумента). На следующем шаге я извлек элемент массива, используя element_at rand() функцию and .

 val df = spark.range(10)
val arr = Array("bla","foo","bar","yo")
df.withColumn("x", element_at(array(arr.map(lit(_)):_*),lit(ceil(rand()*arr.size)).cast("int"))).show
  

вывод:

  --- --- 
| id|  x|
 --- --- 
|  0|bar|
|  1|foo|
|  2|bar|
|  3|foo|
|  4|bla|
|  5|bla|
|  6|foo|
|  7|bla|
|  8|bla|
|  9|foo|
 --- ---