【问题标题】:What is the equivalent of a for loop in sparkR?sparkR中的for循环相当于什么?
【发布时间】:2016-08-19 04:05:58
【问题描述】:

我需要对数据框的所有列组合执行数学运算。在 R 中,我会使用一个简单的嵌套 for 循环来做到这一点。但在 sparkR 中,我认为 for 循环不可用。你会建议我如何处理这个问题?

【问题讨论】:

  • 了解您需要迭代的内容会有所帮助。在传统的 R 循环中,您可以调用 SparkR 函数。例如,您可以使用 R for 循环并遍历 R data.frames 列表,并将它们转换为 Spark DataFrames,并在它们上调用 SparkR glm() 函数。您是否正在尝试遍历 SparkR DataFrame?如果是这样,每一行都试图做什么,为什么需要 Spark 的分布式处理能力来对单行做某事?迭代意味着一次做一件事情 - Spark 是关于并行地做事情。
  • 另外,请注意,如果您在 Spark DataFrame 上使用 R for() 循环进行迭代,它将一次选择一列。 for (item in mySparkDF) {str(item)} 一次返回一列。
  • @SpiritusPrana - 我需要遍历列而不是行。并且每次迭代都是独立的,因此分布式环境应该是有用的。我想要做的一个例子是,如果我有一个 df 列 -col1,col2,col3 。我需要执行 - sum(col1)-sum(col2); sum(col1) - sum(3);对于所有列的组合,依此类推

标签: sparkr


【解决方案1】:

你可以使用foreach函数。

foreach(rdd, func)

foreachPartition(rdd, func)

例子:

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

您可以参考Documentation for package ‘SparkR’

【讨论】:

  • 您提供的文档适用于 version-0.1 。我现在使用的是1.6。该功能不再可用。
【解决方案2】:

@avinash 继续我们在 cmets 中的对话。 IMO 在学习/研究 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]))
    }
  }
}

希望对你有帮助

【讨论】:

    【解决方案3】:

    最好在你的案例中使用 SqlContext,尽管你没有提供任何可重现的代码。

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 2013-06-29
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2021-02-15
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多