Получить индекс макс Spark Dataframe с Sparklyr - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь получить индекс максимальных значений в строке из кадра данных Spark.Это просто, чтобы получить максимальное значение.Я делаю следующее:

library(sparklyr)
library(dplyr)

config <- spark_config()
sc <- spark_connect(master = "local", config = config)

df <- replicate(n = 3, sample(x = 0:10,size = 10, rep=TRUE)) %>%
  as.data.frame()


sdf <- sdf_copy_to(sc, df, overwrite = T)

sdf %>% spark_apply(
  function(df) {
    return( pmax(df[1], df[2], df[3]) )})

Я пытался собрать их в вектор, используя ft_vector_assembler, но я не знаком с возвращаемой структурой данных.Например, я не могу восстановить max из следующего кода

sdf %>% ft_vector_assembler(
  input_cols = c("V1", "V2", "V3"), 
  output_col = "features") %>%
  select(features) %>%
  spark_apply( function(df) pmax(df))

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 октября 2018

Давайте начнем с вашей первой проблемы:

Получить максимальное значение просто.

Это действительно так, однако spark_apply это просто не выходидти.Вместо этого лучше использовать функцию greatest:

sdf %>% mutate(max = greatest(V1, V2, V3))

Эта же функция может быть использована для решения второй проблемы, однако из-за ограничений sparklyr вам придется использовать выражение SQL напрямую:

expr <- c("V1", "V2", "V3") %>% 
  paste0(
    "CAST(STRUCT(`",
    ., "`, ", seq_along(.),
    ") AS struct<value: double, index: double>)", collapse=", ")  %>% 
  paste0("greatest(", ., ").index AS max_index")

sdf %>% 
  spark_dataframe() %>%
  invoke("selectExpr", list("*", expr)) %>%
  sdf_register()

В Spark 2.4 (как сейчас не поддерживается в sparklyr), может быть возможно до

sdf %>% mutate(max
  max_index = array_max(arrays_zip(array(V1, V2, V3), array(1, 2, 3))).1
)
...