2016-05-24 10 views
1

SparkRを使用していて、列に含まれる文字列の最後の文字を分離するためにsubstr()コマンドを使用します。私は一定の開始位置と終了位置に設定した場合、私は仕事にsubstr()を取得することができます。SparkRのDataFrame列でのsubstr()の使用

sdfIris <- createDataFrame(sqlContext, iris) 
sdfIris$Len <- length(sdfIris$Species) 
sdfIris$Last <- substr(sdfIris$Species, sdfIris$Len, sdfIris$Len) 

エラー:

substr(sdfIris$Species, 8, 8) 

をしかし、私はデータフレームからソース値を使用してこれらのパラメータを設定しようとすると、 as.integerに(開始 - 1):タイプ「整数」のベクトルにタイプ「S4」を強制することができない

結果がから戻されると思われますはおそらく1セルのDataFrameであり、パラメータには整数が必要です。

私はcollect(sdfIris$Len)を試してみましたが、している:関数の継承された方法を見つけることができませんでした署名は '収集' ' "列"'

:FDEF(機能(クラス、mtable)でのエラーを

これはsubstr()は、データフレームとしてsdfIris$Lenを見ているようだ。ちぐはぐなようだが、collect()は列としてそれを見ているようだ。私はすでに仕事-Aを同定している

registerTempTableを使用し、最後の文字を分離するためにSparkSQLのsubstrを使用していましたが、私はSQLへの不要な切り替えを避けることを望んでいました。

Dynamic StartとFinishパラメータを持つDataFrame列でSparkR substr()を使用するにはどうすればよいですか?

答えて

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

thanks @ zero323!それは今のところうまくいく - 私は最初にregisterTempTable()を呼び出す必要はありません。私は、私の必要性がバグか機能要求かどうかをスパークプロジェクトに問い合わせようとします。 – SpiritusPrana

+0

機能のリクエスト。 JVM上に動的オフセットを持つデータフレームAPIはありません。これはRで公開できませんでした。 – zero323

+0

もう一度ありがとうございます! – SpiritusPrana

関連する問題