#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|
--- ---