在SparkR中的DataFrame列上使用substr()

时间:2016-05-24 12:08:25

标签: r apache-spark dataframe substr sparkr

我正在使用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()

1 个答案:

答案 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查询。