2016-08-25 7 views
2

私はdapply()を使っていくつかの関数を適用し、新しい列を追加したいSparkDataFrameを持っています。SparkDataFrameのスキーマを編集するには?

sparkRのdapplyは、呼び出された関数の出力と一致するスキーマを必要とします。 たとえば、

#Creating SparkDataFrame 

sdf<-as.DataFrame(iris) 

#Initiating Schema 

schm<-structType(structField("Sepal_Length", "double"),structField("Sepal_Width", "double"),structField("Petal_Length","double"),structField("Petal_Width","double"),structField("Species","string"),structField("Specie_new","string")) 

#dapply code 
sdf2<-dapply(sdf,function(y) 
    { 
    y$Specie_new<-substr(y$Specie,nchar(y$Species)-1,nchar(y$Species)) 
return(y) 
},schm) 

同じ方法を実行する方法はありますか?私は100列あれば、これは実現可能な選択肢ではないでしょう、私はこれらのケースで何をすべきですか?

答えて

2

おそらくもっと良い方法は、このような単純なケースについてdapplyを避けることです。

regexp_extract(df$Species, "^.*(.{2})$", 1) 

またはスパークSQL関数(SparkR::substrSparkR::length)の組み合わせ:あなたは簡単に同じ結果を達成するために、単純な正規表現を使用することができます。

まだ、既存のスキーマを簡単に再利用して、新しいスキーマを作成することは簡単です。

foo <- structField("foo", "string") 

だけで、既存の1のフィールドを抽出し、それらを組み合わせて:あなたは新しいフィールドfooを追加したいと仮定すると、

do.call(structType, c(schema(df)$fields(), list(foo))) 
1

たぶん少し遅れますが、スパークのように、zero323の答えに追加しますv2.2.0:

#Initiating Schema  
added_schm <- structType(structField("Specie_new","string")) 
schm <- do.call(structType, append(schema(sdf)$fields(), added_schm$fields())) 
関連する問題