SparkR去数据子集错误:object of type 'S4' is not subsettable

sparkR在加载完数据之后取数据子集的时候出现如下错误:

> coincidence.indicator <- coincidence.indicator.original[1:coincidence.indicator.date,2:(coincidence.indicator.number+1)]
Error in coincidence.indicator.original[1:coincidence.indicator.date,  : 
  object of type 'S4' is not subsettable

造成的原因是:

R在S3语法中与S4语法中访问数据子集的方式不同, s4类型的数据集不能使用[,]这个方式 


解决方法:

先把s4类型的数据转化为数据框,

coincidence.indicator <- fortify(coincidence.indicator.original)

因为 fortity函数是ggplot2包里的,所以先加载ggplot2包

首先在R中加载ggplot2包
install.packages('ggplot2', dependencies=TRUE, repos='http://cran.rstudio.com/')
之后在SparkR中加载包
library(ggplot2)

之后又出现如下错误:

Error: ggplot2 doesn't know how to deal with data of class DataFrame

于是再看Spark官网对spark DataFrame的介绍:

SparkR是一个R语言包,它提供了轻量级的方式使得可以在R语言中使用Apache Spark。在Spark 1.6.1中,SparkR实现了分布式的data frame,支持类似查询、过滤以及聚合的操作(类似于R中的data frames:dplyr),但是这个可以操作大规模的数据集。


DataFrame是数据组织成一个带有列名称的分布式数据集。在概念上和关系型数据库中的表类似,或者和R语言中的data frame类似,但是这个提供了很多的优化措施。构造DataFrame的方式有很多:可以通过结构化文件中构造;可以通过Hive中的表构造;可以通过外部数据库构造或者是通过现有R的data frame构造等等。


我们可以看到 spark dataframe 的几个关键点:

  • 分布式的数据集
  • 类似关系型数据库中的table,或者 excel 里的一张 sheet,或者 python/R 里的 dataframe
  • 拥有丰富的操作函数,类似于 rdd 中的算子
  • 一个 dataframe 可以被注册成一张数据表,然后用 sql 语言在上面操作
  • 丰富的创建方式
    • 已有的RDD
    • 结构化数据文件
    • JSON数据集
    • Hive表
    • 外部数据库

DataFrame API 是在 R 和 Python data frame 的设计灵感之上设计的,具有以下功能特性:

  • 从KB到PB级的数据量支持;
  • 多种数据格式和多种存储系统支持;
  • 通过Spark SQL 的 Catalyst优化器进行先进的优化,生成代码;
  • 通过Spark无缝集成所有大数据工具与基础设施;
  • 为Python、Java、Scala和R语言(SparkR)API;

简单来说,dataframe 能够更方便的操作数据集,而且因为其底层是通过 spark sql 的 Catalyst优化器生成优化后的执行代码,所以其执行速度会更快。总结下来就是,使用 spark dataframe 来构建 spark app,能:

  • write less : 写更少的代码
  • do more : 做更多的事情
  • faster : 以更快的速度
所以到此明白,R中的操作并不能完全移植到sparkR中,在移植的过程中需要参考SparkR API对数据集做一些相应的转化操作。。。。。


至此才算对SparkR有了一个正确的认识,实践出真知啊真是。。。。



你可能感兴趣的:(Spark,R)