Мне нужно выполнить математическую операцию для всех комбинаций столбцов моего фрейма данных. В R я сделал бы это с помощью простого вложенного цикла. Но в sparkR я не думаю, что цикл доступен. Как бы вы посоветовали мне с этим справиться?Что такое эквивалент цикла for в sparkR?
ответ
Вы можете использовать foreach функция.
Еогеасп (РДД, FUNC)
foreachPartition (РДД, FUNC)
Пример:
##To print each element in an RDD
foreach(rdd, function(x) { print(x) })
Вы можете Направить Documentation for package ‘SparkR’
документ, который вы предоставили, предназначен для версии 0.1. Сейчас я использую 1.6. Функция больше не доступна. – avinash
@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]))
}
}
}
Я надеюсь, что помогает
Это лучше, если вы используете SqlContext для вашего случая, хотя вы не предоставили никакой воспроизводимый код.
Было бы полезно узнать, что вам нужно для повторения. В пределах обычной петли R вы можете вызывать функции SparkR. Например, вы можете использовать цикл R для цикла и перебирать список R data.frames и преобразовывать их в Spark DataFrames и вызывать на них функцию SparkR glm(). Это то, что вы пытаетесь выполнить итерацию через SparkR DataFrame? Если да, то что нужно делать с каждой строкой, и для чего вам нужна распределенная вычислительная мощность Spark, чтобы сделать что-то в одной строке? Итерация означает делать вещи по одному - Искра - это делать вещи параллельно. – SpiritusPrana
Кроме того, имейте в виду, что если вы итерации используете цикл R for() в Spark DataFrame, он будет выбирать по одному столбцу за раз. 'for (item в mySparkDF) {str (item)}' возвращает по одному столбцу за раз. – SpiritusPrana
@SpiritusPrana - мне нужно перебирать столбцы, а не строки. И каждая итерация независима, поэтому распределенная среда должна быть полезна. Пример того, что я пытаюсь сделать, это если у меня есть df с столбцами -col1, col2, col3. мне нужно выполнить - sum (col1) -sum (col2); сумма (col1) - сумма (3); и т. д. для всех комбинаций столбцов –
avinash