0

在 sparkR 中,我有一个包含用户数据的 DataFrame 'pgz'。要获取 'pgz' 中的所有 user_id 1,我们只需键入

filter(pgz, pgz$user_id==1)

我有一个“列表”,它是一个 DataFrame。它只包含数字 (1,3,4,5,11,25,....)。我将其设为本地,以便获取条目。

localliste <- collect(liste)

现在'localliste'是一个data.frame。然后我有一个函数'lev'

lev <- function(j) {
user_id_pgz <- filter(pgz, pgz$user_id==as.numeric(localliste[j]))
t <- as.Date(first(user_id_pgz)[,6][1])
return(t)
}

返回't'。当我在小 j 上运行此功能时,该功能非常快。计算 t 大约需要 0.01 秒。当我选择一个较大的 j 时,该函数需要更长的时间来计算 t。当 j=1002 时,计算 lev(j) 需要 40 秒。

这是一件奇怪的事情。运行'lev'中的第一行不需要时间,而是行

t<-as.Date(first(user_id_pgz)[,6][1])

大 j 需要时间。然而,如果 j=1000 或 j=50000 运行时间为 40 秒,则无关紧要,但对于 j=25,运行时间约为 1 秒。这是为什么 ?

4

1 回答 1

0

我创建了一个最小的示例,您可以在其中获取每个 user_id 的第 6 列的第一项。首先,我创建一个带有 user_id 列和 col6 的 DataFrame(就像你的 [,6] 一样,然后我按 user_id 分组(与过滤相同),最后,每组我取第一个元素。这样,你有每个 user_id 的结果,也许您的列表中的元素较少?

df <- data.frame(user_id=c(1,1,2,2),
                 col6=c("2015-7-31","2015-8-31","2015-8-31","2015-7-31"))

pgz <- createDataFrame(sqlContext, df)
pgz$col6 <- cast(pgz$col6,'date')

results <- collect(agg(group_by(pgz,pgz$user_id),firstCol6 = first(pgz$col6)))
于 2015-08-14T11:35:01.230 回答