2016-05-30 9 views
1

私は文字列を含むデータフレームを持っています。私はsparkとscalaを使用してk-meansの入力として使用する予定です。VectorAssemblerはStringType型をサポートしていませんscala spark convert

val toDouble = udf[Double, String](_.toDouble) 
val analysisData = dataframe_mysql.withColumn("Event", toDouble(dataframe_mysql("event"))).withColumn("Execution", toDouble(dataframe_mysql("execution"))).withColumn("Info", toDouble(dataframe_mysql("info")))    
val assembler = new VectorAssembler() 
    .setInputCols(Array("execution", "event", "info")) 
    .setOutputCol("features") 
val output = assembler.transform(analysisData) 
println(output.select("features", "execution").first()) 

変換データスキーマを出力すると、変換が正しいときに、データフレームの文字列型カラムを変換しています。私は例外を取得しています:VectorAssemblerはStringTypeタイプ をサポートしていません。これは、私の値がまだ文字列であることを意味します!スキーマの種類だけでなく、値をどのように変換できますか?

おかげ

答えて

3

は確かに、VectorAssembler変圧器は、文字列を取ることはありません。そのため、列が数値型、ブール型、ベクトル型と一致するようにする必要があります。あなたのudfが正しいことをしていることを確認し、列のどれもStringTypeを持たないようにしてください。

、別の型にスパークデータフレームの列を変換し、それを簡単にし、そのようにキャスト()DSL機能を使用するには:それは動作するはずです

val analysisData = dataframe_mysql.withColumn("Event", dataframe_mysql("Event").cast(DoubleType)) 

+0

浮動小数点数に変換する必要があるのは1〜数列ではなく、50または100または300である場合はどうしますか? –

+0

ちょっと@EvanZamir、 'df.selectExpr(" cast(col1 as float)col1 "、" cast(col2 as float)col2 ")のようにsthを試すことができます。 –

関連する問題