在sparkR中运行tabulate和which.max函数

时间:2015-09-01 09:28:32

标签: r sparkr

我在sparkR中有一个DataFrame data。它包含user = 12 311 12 320, ...type = 1 2 3 4。我们有10000个用户。

例如,一个用户的类型= 1 2 3 4 4 4 2 4。 我想为这个用户找到类型中最常见的整数。在R我可以这样解决

mostcommon <- which.max(tabulate(user$type))

鉴于&#39;用户&#39;是一个data.frame而不是DataFrame。 我希望为数据中的所有用户执行此操作。一种方法是这样做

u<- c()
for(j in 1:10000) {
id <- filter(data, data$user== j)
# For the jth user I make the data local to run the 
# which.max and tabulate functions
idlocal <- collect(id)
u[j] <- which.max(tabulate(idlocal$type))
}

这在R / sparkR中运行,u为我提供了所有用户最常用的类型。但这需要时间,因为我使用本地数据来运行which.max和制表函数。有更智能,更快捷的方法吗?

另外,如何才能找到两种最常见的类型?

1 个答案:

答案 0 :(得分:3)

也许不是最好的解决方案,但它有效:

创建示例数据

localData <- data.frame(user = c(1,1,1,2,2,2),
                        type = c(1,2,2,3,3,2))

data <- createDataFrame(sqlContext, localData)

按用户分组并键入和计算它出现的次数(表格类型)

groupedData <- groupBy(data, data$user, data$type)
aggregated  <- agg(groupedData, number = n(data$user))

对此计数的数字进行排序,因为这是查找具有最大出现次数的类型的最简单方法。

arranged <- arrange(aggregated, desc(aggregated$number))

再次对用户进行分组并采取第一次出现的类型,这是我们订购后的最大值。

regroupedData <- groupBy(arranged, arranged$user)
firstItems    <- agg(regroupedData, firstType = first(arranged$type), number = first(arranged$number))

查看结果

collect(firstItems)

如果你现在也想要第二个最多的项目,你可以先删除这些第一项

firstDeleted <- except(arranged,firstItems)

再次应用相同的方法

rearranged   <- arrange(firstDeleted, desc(firstDeleted$number))

reregroupedData <- groupBy(rearranged, rearranged$user)
secondItems     <- agg(reregroupedData, secondType = first(rearranged$type))

删除非必要列并重命名列 firstItems $ number&lt; - NULL secondItems&lt; - withColumnRenamed(secondItems,&#34; user&#34;,&#34; user2&#34;)

要获得最终结果,请加入这些DataFrames(zh_cn删除列user2)

result <- join(firstItems,secondItems, firstItems$user == secondItems$user2)

result$user2 <- NULL

再次检查这些结果

collect(result)