2016-08-19 3 views
1

Мне нужно выполнить математическую операцию для всех комбинаций столбцов моего фрейма данных. В R я сделал бы это с помощью простого вложенного цикла. Но в sparkR я не думаю, что цикл доступен. Как бы вы посоветовали мне с этим справиться?Что такое эквивалент цикла for в sparkR?

+0

Было бы полезно узнать, что вам нужно для повторения. В пределах обычной петли R вы можете вызывать функции SparkR. Например, вы можете использовать цикл R для цикла и перебирать список R data.frames и преобразовывать их в Spark DataFrames и вызывать на них функцию SparkR glm(). Это то, что вы пытаетесь выполнить итерацию через SparkR DataFrame? Если да, то что нужно делать с каждой строкой, и для чего вам нужна распределенная вычислительная мощность Spark, чтобы сделать что-то в одной строке? Итерация означает делать вещи по одному - Искра - это делать вещи параллельно. – SpiritusPrana

+0

Кроме того, имейте в виду, что если вы итерации используете цикл R for() в Spark DataFrame, он будет выбирать по одному столбцу за раз. 'for (item в mySparkDF) {str (item)}' возвращает по одному столбцу за раз. – SpiritusPrana

+0

@SpiritusPrana - мне нужно перебирать столбцы, а не строки. И каждая итерация независима, поэтому распределенная среда должна быть полезна. Пример того, что я пытаюсь сделать, это если у меня есть df с столбцами -col1, col2, col3. мне нужно выполнить - sum (col1) -sum (col2); сумма (col1) - сумма (3); и т. д. для всех комбинаций столбцов – avinash

ответ

1

Вы можете использовать foreach функция.

Еогеасп (РДД, FUNC)

foreachPartition (РДД, FUNC)

Пример:

##To print each element in an RDD 
    foreach(rdd, function(x) { print(x) }) 

Вы можете Направить Documentation for package ‘SparkR’

+0

документ, который вы предоставили, предназначен для версии 0.1. Сейчас я использую 1.6. Функция больше не доступна. – avinash

1

@avinash продолжение нашего разговора в комментариях. ИМО важно иметь в виду, изучая/исследуя SparkR, задачи, которые лучше всего использовать Spark, по сравнению с теми вещами, которые лучше всего делать вне SparkR. Энергия Spark заключается в обработке больших наборов данных, поэтому в вашей задаче вычисление сумм столбцов подходит для распределенной вычислительной мощности Spark. Однако Spark не предоставляет возможности для обработки отдельных значений, просто DataFrames и столбцов. Следовательно, математика по итоговым значениям столбцов лучше всего делать за пределами Spark. Вот как я бы подойти к вашей проблеме:

# prep R data.frame 
col1 <- c(1,2,3) 
col2 <- c(4,5,6) 
col3 <- c(7,8,9) 
rdf <- data.frame(col1, col2, col3) 

# create spark DataFrame 
sdf <- createDataFrame(sqlContext, rdf) 

# use spark to calc totals 
sdfSums <- agg(sdf, col1="sum", col2="sum", col3="sum") 
names(sdfSums) <- c("col1Sum", "col2Sum", "col3Sum") 

# collect the resulting 1 row DataFrame back into an R data.frame 
rdfSums <- collect(sdfSums) 

# do the math on the values in R 
for (i in 1:ncol(rdfSums)){ 
    for (j in 1:ncol(rdfSums)){ 
    if (i != j) { 
     print( paste("column",i,"minus column", j,"equals", rdfSums[,i]-rdfSums[,j])) 
    } 
    } 
} 

Я надеюсь, что помогает

0

Это лучше, если вы используете SqlContext для вашего случая, хотя вы не предоставили никакой воспроизводимый код.

Смежные вопросы