SparkR foreach循环

时间:2017-01-23 21:50:46

标签: r lapply sparkr

在Spark的Java / Scala / Python实现中,可以简单地调用import java.util.Scanner; @SuppressWarnings("unused") public class One { public static void main(String[] args) { System.out.println("Enter a Word with toggled alphabets"); Scanner sc=new Scanner(System.in); String line =sc.nextLine(); char[] arr= line.toCharArray(); for(char ch: arr) { if(Character.isUpperCase(ch)){ ch= Character.toLowerCase(ch); } else if(Character.isLowerCase(ch)){ ch= Character.toUpperCase(ch); } System.out.print(ch); }}} foreach类型的RDD方法,以便在数据集上并行化迭代。

在SparkR中,我无法找到这样的指示。迭代DataFrame

行的正确方法是什么?

我只能找到DataFramegapply函数,但我不想计算新列值,我只想通过从列表中取一个元素来做某事平行。

我之前的尝试是dapply

lapply

但我收到此错误:

inputDF <- read.df(csvPath, "csv", header = "true", inferSchema = "true", na.strings = "")
createOrReplaceTempView(inputDF,'inputData')

distinctM <- sql('SELECT DISTINCT(ID_M) FROM inputData')

collected <- collect(distinctM)[[1]]

problemSolver <- function(idM) {
  filteredDF <- filter(inputDF, inputDF$ID_M == idM)
}

spark.lapply(c(collected), problemSolver)

R提供解决此类问题的解决方案是什么?

1 个答案:

答案 0 :(得分:3)

我也有类似的问题。收集DataFrame会将其作为数据帧放入R中。从那里,你可以像往常一样在常规的老R中获得每一行。在我看来,这是一个处理数据的可怕主题,因为你失去了Spark提供的并行处理。而不是收集数据然后过滤,使用内置的SparkR函数,selectfilter等。如果你想做逐行操作符,内置的SparkR函数通常会为你执行此操作,否则,我发现selectExprexpr 非常非常有用原始的Spark函数设计用于处理单个值(想想:from_unix_timestamp)

所以,为了得到你想要的东西,我会尝试这样的东西(我在SparkR 2.0 +上):

Frist阅读数据:

inputDF<- read.df(csvPath, "csv", header = "true", inferSchema = "true", na.strings = "")

然后将其设为RDD:inputSparkDF<- SparkR::createDataFrame(inputDF)

接下来,仅隔离不同/唯一值(我使用magrittr进行管道处理(在SparkR中工作)):

distinctSparkDF<- SparkR::select(inputSparkDF) %>% SparkR::distinct()

从这里开始,您可以在Spark的世界中应用过滤:

filteredSparkDF<- SparkR::filter(distinctSparkDF, distinctSparkDF$variable == "value")

在Spark为您过滤了这些数据之后,将子集收集到基本R中作为工作流中的 last 步骤是有意义的:

myRegularRDataframe<- SparkR::collect(filteredSparkDF)

我希望这会有所帮助。祝你好运。 --nate