sparkR用于过滤不在数据帧中的数据

时间:2016-06-12 01:47:35

标签: r apache-spark sparkr

我在R中创建了1:10000数据。使用SparkR,我用1:10000数据创建了RDD。我想过滤,以便打印出数据< 10使用SparkR。我正在学习SparkR,我将不胜感激任何帮助。在将其标记为重复之前,请仔细阅读该问题。我还为那些喜欢在最后使用数据框的人提供了代码。

 library(SparkR)
 sc <- sparkR.init(master = "local")
 sqlContext <- sparkRSQL.init(sc)
 Data <- c(1:10000)
 distData <- SparkR:::parallelize(sc,Data)

我想打印出所有数据&lt; 10。我尝试了以下方法来获得答案。不幸的是,我得到了相应的错误。问题不在于并行化功能。我遇到过滤和收集功能的问题。有关详细信息,请参阅我运行的不同试验和相关错误。

 SparkR:::filter(distData[distData < 10])

 Error: Error in SparkR:::filter(distData[distData < 10]) : 
 error in evaluating the argument 'x' in selecting a method for function     'filter': Error in distData[distData < 10] : 
error in evaluating the argument 'i' in selecting a method for function '[': Error in distData < 10 : 
comparison (3) is possible only for atomic and list types

SparkR:::filter(sc,distData[distData < 10])

Error in SparkR:::filter(sc, distData[distData < 10]) : 
error in evaluating the argument 'condition' in selecting a method for   function 'filter': Error in distData[distData < 10] : 
error in evaluating the argument 'i' in selecting a method for function '[':    Error in distData < 10 : 
comparison (3) is possible only for atomic and list types

SparkR:::collect(distData,filter(distData[distData<10]))

Error in filter(distData[distData < 10]) : 
error in evaluating the argument 'x' in selecting a method for function  'filter': Error in distData[distData < 10] : 
error in evaluating the argument 'i' in selecting a method for function '[':   Error in distData < 10 : 
comparison (3) is possible only for atomic and list types


SparkR:::collect(distData, function(dist){
     print(dist[dist<10])
})

Error in if (flatten) { : argument is not interpretable as logical


filter(distData, function(dist){
  print(dist[dist<10])
})

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘filter’ for signature  ‘"RDD", "function"’

以下是使用数据框时可以使用的代码

 df <- SparkR:::createDataFrame(sqlContext,distData)
 colnames(df)<-c("random")
 df1<-subset(df, nana$random<10)
 SparkR:::collect(df1)

1 个答案:

答案 0 :(得分:0)

SparkR命令仅适用于Spark DataFrames,而只有一列的Spark DataFrames不是列表。您的filter()语法似乎假设您正在处理列表,而distData是一列DataFrame。您必须在出现错误的示例中的filter()命令中指定列名。运行str(distData)检查您的列名称。然后使用distData$colName < 10

应用过滤器()

this question的答案中提供了如何使用subset(),sql和filter()函数过滤Spark DataFrame的示例。 @ zero323回答了描述过滤函数的工作语法的问题。