“ agg(x,...)中的错误:agg只能支持列或字符”错误

时间:2019-04-02 11:26:18

标签: r apache-spark sparkr

我正在尝试汇总一个SparkR数据框以获得两个摘要变量, 我要使用的代码是:

temp1_aggregate<- temp1 %>%
  groupBy("Week", "Store", "Brand", "Conversion_Factor", "Manufacturer", "Type") %>%
agg(Value=mean("Value"), Volume=mean("Volume"))

我也尝试过summarise()而不是agg():

temp1_aggregate<- temp1 %>%
      groupBy("Week", "Store", "Brand", "Conversion_Factor", "Manufacturer", "Type") %>%
  SparkR::summarize(Value=mean("Value", na.rm=TRUE),Volume=mean("Volume", na.rm=TRUE))

其中“值”和“体积”是数字(双精度)类型的列。

这两者都会导致相同的错误:

Error in agg(x, ...) : agg can only support Column or character
In addition: Warning message:
In mean.default("Value", na.rm = TRUE) :
  argument is not numeric or logical: returning NA

对此我感到很困惑,因为“值”和“体积”都是列并且都是数字(我检查了-尽管我不能共享数据,因为它是专有的)。

我认为这些错误是因为语法在某种程度上不正确(我试图从dplyr转换为SparkR,因为我需要使其与Spark数据帧一起使用),但我无法解决。

请问有人可以如何使它工作吗?

1 个答案:

答案 0 :(得分:1)

SparkR没有character的平均实现-它只能采用列,因此可以从警告消息中推断出,mean("Volume")的呼叫被分派到base::mean并返回NA

要使其正常工作,您必须使用显式columns

agg(Value = mean(column("Value")), Volume = mean(column("Volume")))

您也可以将mean替换为avg SparkR::avg

agg(Value = avg(column("Value")), Volume = avg(column("Volume")))

,如果您传递了简单的character,它不会隐藏任何内置方法,并且会提供更有意义的错误:

  

错误(函数(类,fdef,mtable)):     无法为签名“字符”找到函数“ avg”的继承方法