在 SparkR 的 DataFrame 列上使用 substr()

Use of substr() on DataFrame column in 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)

Error in as.integer(start - 1) : cannot coerce type 'S4' to vector of type 'integer'

看来sdfIris$Len返回的结果可能是一个单格DataFrame,参数需要整数。

我试过了collect(sdfIris$Len),但是:

Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘collect’ for signature ‘"Column"’

这似乎不协调。 substr() 似乎将 sdfIris$Len 视为 DataFrame,但 collect() 似乎将其视为列。

我已经通过使用 registerTempTable 和使用 SparkSQL 的 substr 来隔离最后一个字符确定了一个解决方法,但我希望避免切换到 SQL.

如何在具有动态开始和结束参数的 DataFrame 列上使用 SparkR substr()

它不是最优的,但你可以使用 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 查询。