2016-05-24 6 views
1

Я использую SparkR и хочу использовать команду substr(), чтобы изолировать последний символ строки, которая содержится в столбце. Я могу substr() работать, если я установил StartPosition и конечное положение к постоянному:Использование substr() в столбце DataFrame в SparkR

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 (начало - 1): не может заставить типа «S4» для вектора типа «целого»

кажется, что результат возвращается из sdfIris$Len - это, возможно, однокамерный DataFrame, а для параметра требуется целое число.

Я попытался collect(sdfIris$Len), но:

Ошибка (функция (классы, FDEF, mtable): не удалось найти наследуемый метод для функции 'собирать' для подписания 'Колонка "'

Это кажется нелогичным. substr() чудится sdfIris$Len как DataFrame, но collect() кажется, видит это как колонна.

Я уже определил работу-а round, используя registerTempTable и используя SparkSQL для выделения последнего символа, но я надеялся избежать ненужных шагов перехода на SQL.

Как использовать SparkR substr() в столбце DataFrame с динамическими параметрами запуска и завершения?

ответ

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.

+0

спасибо @ zero323! Это будет работать сейчас - по крайней мере, мне не нужно сначала регистрироватьTempTable(). Я попытаюсь спросить проект Spark, является ли моя потребность ошибкой или запросом функции. – SpiritusPrana

+0

Запрос функции. Нет API-интерфейса DataFrame с динамическими смещениями на JVM, если он не может быть выставлен в R. – zero323

+0

Еще раз спасибо! – SpiritusPrana