2015-07-16 3 views
0

Я обычный пользователь R.Статистика агрегирования в sparkR 1.4.0

Для data.frame, который выглядит следующим образом, я хотел бы рассчитать базовую статистику агрегации; минимум, 1-й квантиль, медианный, третий квантил и максимум. Следующий код, используя reshape2 пакет и dplyr приступить к этой opperation в регулярном обычном R является

library(reshape2) 
library(dplyr) 
tidy_data <- data.frame(topic1 = rnorm(10^6), 
               topic2 = rnorm(10^6), 
               topic3 = rnorm(10^6), 
               topic4 = rnorm(10^6), 
               topic5 = rnorm(10^6)) 
tidy_data %>% 
    melt(measure.vars = c("topic1","topic2","topic3","topic4","topic5")) %>% 
    group_by(variable) %>% 
    summarise(MIN = min(value), 
         Q1 = quantile(value, 0.25), 
          Q2 = median(value), 
          Q3 = quantile(value, 0.75), 
          MAX = max(value)) 

Мне интересно, как такие операции могут быть воспроизведены в кадре распределенных данных (DataFrame объекта искры из) в sparkR .I've удалось вычислить максимум каждой переменной, но не достаточно и элегантно. Есть ли способ сделать это эффективным и плавным способом?

Моего sparkR ниже выполнение кода:

system.time({ 
    print(
     head(
      summarize(topics5, 
           MAX5 = max(topics5$topic5), 
           MAX4 = max(topics5$topic4), 
           MAX3 = max(topics5$topic3), 
           MAX2 = max(topics5$topic2), 
           MAX1 = max(topics5$topic1) 
           ) 
      ) 
     ) 
    }) 
+1

Вообще говоря вычисления точных квантилей на больших массивах данных, как правило, не практично. Можно использовать внутренний API для получения чего-то подобного [this] (http://stackoverflow.com/a/31437177), но я снова сомневаюсь, что это хорошая идея. Что касается остальной части вашего вопроса ... Если по «эффективному и плавному» вы имеете в виду нечто похожее на типичное для метапрограммирования магии R, я боюсь, что нет ничего подобного (пока?). В источнике SparkR нет 'substitute',' lazy_eval' и подобных материалов. – zero323

+0

Spark SQL намного более зрелый и может быть легко доступен из SparkR. Что-то вроде 'registerTempTable (themes5," themes5 "); sql (sqlContext, "SELECT max (topic5) max5, max (topic4) max4, ..., FROM themes5") ', вероятно, стоит рассмотреть. – zero323

+2

Пробовал ли вы новый пакет 'SparkRext', доступный на github https://github.com/hoxo-m/SparkRext. Он использует тот же синтаксис 'dplyr' для управления Spark' DataFrames'. – KRC

ответ

2

Вы можете использовать метод describe в SparkR для создания статистики по числовым столбцам. Например:

df <- data.frame(a=rnorm(10), b=rnorm(10)) 
sdf <- createDataFrame(sqlContext, df) 
collect(describe(sdf)). 

Это должно напечатать подсчет, средний, максимальный, минимальный и т.д.