我希望在数据框中获得一些描述性统计信息:
# Initialize SparkR Contexts
library(SparkR) # Load library
sc <- sparkR.init(master="local[4]") # Initialize Spark Context
sqlContext <- sparkRSQL.init(sc) # Initialize SQL Context
# Load data
df <- loadDF(sqlContext, "/outputs/merged.parquet") # Load data into Data Frame
# Filter
df_t1 <- select(filter(df, df$t == 1 & df$totalUsers > 0 & isNotNull(df$domain)), "*")
avg_df <- collect(agg(groupBy(df_t1, "domain"), AVG=avg(df_t1$totalUsers), STD=sd(df_t1$totalUsers, na.rm = FALSE)))
head(avg_df)
我收到此错误:
Error in as.double(x) :
cannot coerce type 'S4' to vector of type 'double'
由sd()
生成。我尝试使用var()
并获取Error: is.atomic(x) is not TRUE
。仅使用avg()
时,我没有收到任何错误。
我的问题与this one不同,因为我没有使用这些软件包,并且正在阅读this我理解由于某些原因我的df_t1$tutoalUsers
类型为S4
而非双向的矢量,所以我尝试了它没有效果:
avg_df <- collect(agg(groupBy(df_t1, "domain"),AVG=avg(df_t1$totalUsers), STD=sd(cast(df_t1$totalUsers, "double"),na.rm = FALSE)))
思想?
编辑:架构是
> printSchema(df_t1)
root
|-- created: integer (nullable = true)
|-- firstItem: integer (nullable = true)
|-- domain: string (nullable = true)
|-- t: integer (nullable = true)
|-- groupId: string (nullable = true)
|-- email: integer (nullable = true)
|-- chat: integer (nullable = true)
我的Spark版本是1.5.2
答案 0 :(得分:1)
您正在使用Spark 1.5,它不提供更高级的统计摘要,并且在Spark DataFrame
上运行时无法使用标准R函数。 avg()
有效,因为它实际上是Spark 1.5中可用的Spark SQL函数。
Spark 1.6中引入了其他统计摘要,包括计算标准偏差的方法(sd
,stddev
stddev_samp
和stddev_pop
)和方差(var
,variance
,var_samp
,var_pop
)。您当然可以使用众所周知的公式计算标准偏差,如Calculate the standard deviation of grouped data in a Spark DataFrame