在R / sparkR中加速大数据的udf

时间:2017-03-15 22:16:54

标签: r apache-spark udf

我在一个具有充足内存的单个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是否总是在实际大小的数据集上变慢?

1 个答案:

答案 0 :(得分:0)

仅供记录 - 通过合并替换udf中的表查找,可轻松解决此特定任务:

cdrDist <- cdr %>%
     merge(cellDistrict, by="cell", all.x=TRUE)

其中cellDistrict是包含列celldivision的SparkDataFrame。现在运行数据集需要<10分钟。