我正在使用SparkR并希望使用substr()
命令来隔离列中包含的字符串的最后一个字符。如果我将StartPosition和EndPosition设置为常量,我可以让substr()
工作:
substr(sdfIris$Species, 8, 8)
但是当我尝试使用来自DataFrame的值设置这些参数时:
sdfIris <- createDataFrame(sqlContext, iris)
sdfIris$Len <- length(sdfIris$Species)
sdfIris$Last <- substr(sdfIris$Species, sdfIris$Len, sdfIris$Len)
as.integer(start - 1)出错:无法强制输入&#39; S4&#39;到矢量类型&#39;整数&#39;
似乎从sdfIris$Len
返回的结果可能是一个单元格的DataFrame,参数需要一个整数。
我尝试了collect(sdfIris$Len)
,但是:
(函数(classes,fdef,mtable)中的错误:无法为签名'&#34;列&#34;'
找到函数'collect'的继承方法
这似乎不协调。 substr()
似乎将sdfIris$Len
视为DataFrame,但collect()
似乎将其视为列。
我已经通过使用registerTempTable
并使用SparkSQL的substr来确定最后一个字符,但我希望避免不必要的切换到SQL的步骤。
如何在具有动态Start和Finish参数的DataFrame列上使用SparkR substr()
?
答案 0 :(得分:1)
这不是最佳选择,但您可以使用expr
:
df <- createDataFrame(
sqlContext,
data.frame(s=c("foo", "bar", "foobar"), from=c(1, 2, 0), to=c(2, 3, 5))
)
select(df, expr("substr(s, from, to)")) %>% head()
## substr(s,from,to)
## 1 fo
## 2 ar
## 3 fooba
或selectExpr
:
selectExpr(df, "substr(s, from, to)") %>% head()
## substr(s,from,to)
## 1 fo
## 2 ar
## 3 fooba
以及等效的SQL查询。