我在一个具有充足内存的单个16核节点上使用本地运行的spark 2.1.0。我循环遍历约50个250M行的文件。在UDF阶段,我有一个两个字符串的SparkDataFrame。我应用一个只是表查找的UDF,将一列(单元格)替换为相应的“除法”(整数):
cellToDivision <- function(df) {
## convert dataframe with cell to the one based on division
division <- distCell[as.character(df$cell)]
data.frame(unname(df$msisdn),
unname(division),
# remove names -> otherwise data.frame tries to
# use NA for rowname for missings and fails
stringsAsFactors=FALSE,
check.rows=FALSE)
}
distCell
是一个长度为~10000的整数的命名向量。
我的问题是应用UDF的代码:
dapply(df, cellToDivision,
structType(structField("msisdn", "string"),
structField("division", "integer"))
)
非常缓慢,每个数据集运行大约需要2小时。在250个分区的情况下,代码只挂在那里,5000个分区将在4小时运行,50k分区在2小时运行; 500k分区似乎每个文件给我6小时。
250M行乘2列应完全在此节点的功能范围内。我做错了吗? R中的UDF是否总是在实际大小的数据集上变慢?
答案 0 :(得分:0)
仅供记录 - 通过合并替换udf中的表查找,可轻松解决此特定任务:
cdrDist <- cdr %>%
merge(cellDistrict, by="cell", all.x=TRUE)
其中cellDistrict
是包含列cell
和division
的SparkDataFrame。现在运行数据集需要<10分钟。