SparkR:Error in if(is.na(object)) {: 参数长度为零
SparR:Error in if (is.na(object)) { : argument is of length zero
开门见山:
因为我在运行sparkR的时候发现程序报了如下错误:
这个看起来是if
语句中调用了is.na()
方法,然后因为没有传入参数吧,接着程序报错。
排除问题的过程
获取程序当时报错的异常数据,在程序之中打印运行过程日志,逐个定位到错误代码(这样比较低效,但是这样真的很管用,在此之前我发现了程序里面有大量调用了is.na()
方法的代码,检查这里面的参数真的是太痛苦了)
然后我就定位到一行代码类似于:
data <- data[width != " "]]
类似如上的代码报错了(这段代码在R
的运行环境里面是不会报错,但是在我的sparkR
中的dapply()
函数里面是会报错的)
测试数据如下:
准备了十行三列的空数据
程序代码如下:
dataFrame <- createDataFrame(data)
res <- dapply(dataFrame,function(x){
library(data.table)
res <- data.table(x)
res <- res[width!=""]
res
},schema(dataFrame))
showDF(res)
使用showDF()
只是做一个action
的操作,这样的话可以让程序执行。执行结果如下:
是的,它报错了。这个时候就要去思考有没有什么其它的办法可以替代了。引起这个原因就是width
列全都是NA
哪怕里面有一个非NA
值,程序都不会报错,所以,然后,对于这个空值的还不好处理,所以最后我打算在dapply
函数之外进行操作。操作如下:
dataFrame <- createDataFrame(data)
res <- dapply(dataFrame,function(x){
library(data.table)
res <- data.table(x)
# res <- res[width!=""]
res
},schema(dataFrame))
res <- filter(res,res$width!="")
showDF(res)
或者给这个插入一条假数据,最后程序执行完毕的时候删除