问题描述
这个问题的关键是,我有一些R代码可以在本地数据帧上正常运行,但是在Spark数据帧上却无法运行,即使其他两个表相同。
在R中,给定一个包含所有字符列的数据框,可以将所有列动态类型转换为数字,并可以使用以下代码将其安全地转换为数字:
require(dplyr)
require(varhandle)
require(sparklyr)
checkNumeric <- function(column)
{
column %>% as.data.frame %>% .[,1] %>% varhandle::check.numeric(.) %>% all
}
typeCast <- function(df)
{
columns <- colnames(df)
numericIdx <- df %>% mutate(across(columns,checkNumeric)) %>% .[1,]
doThese <- columns[which(numericIdx==T)]
df <- df %>% mutate_at(all_of(vars(doThese)),as.numeric)
return(df)
}
举一个简单的例子,可以运行:
df <- iris
df$Sepal.Length <- as.character(df$Sepal.Length)
newDF <- df %>% typeCast
class(df$Sepal.Length)
class(newDF$Sepal.Length)
现在,此代码不适用于starwars
这样的具有复合列的数据集。但是对于其他数据框,我希望此代码在Spark数据框上能正常工作。没有。那是:
sc <- spark_connect('yarn',config=config) # define your Spark configuration somewhere,that's outside the scope of this question
df <- copy_to(sc,iris,"iris")
newDF <- df %>% typeCast
将失败,并出现以下错误。
Error in .[1,] : incorrect number of dimensions
在调试时,如果我们尝试运行此代码:
columns <- colnames(df)
df %>% mutate(across(columns,checkNumeric))
返回此错误: UseMethod(“ escape”)中的错误: 没有适用于“功能”类对象的适用于“转义”的方法
有什么作用?为什么代码在本地数据帧上可以正常工作,而在Spark数据帧上不能正常工作?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)