在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
我只能找到DataFrame
和gapply
函数,但我不想计算新列值,我只想通过从列表中取一个元素来做某事平行。
我之前的尝试是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提供解决此类问题的解决方案是什么?
答案 0 :(得分:3)
我也有类似的问题。收集DataFrame会将其作为数据帧放入R中。从那里,你可以像往常一样在常规的老R中获得每一行。在我看来,这是一个处理数据的可怕主题,因为你失去了Spark提供的并行处理。而不是收集数据然后过滤,使用内置的SparkR函数,select
,filter
等。如果你想做逐行操作符,内置的SparkR函数通常会为你执行此操作,否则,我发现selectExpr
或expr
非常非常有用原始的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