データセットに直接ロードしたいcsvファイル[1]があります。問題は、私はいつもまたcsvを直接Spark Datasetにロードするには?
org.apache.spark.sql.AnalysisException: Cannot up cast `probability` from string to float as it may truncate
The type path of the target object is:
- field (class: "scala.Float", name: "probability")
- root class: "TFPredictionFormat"
You can either add an explicit cast to the input data or choose a higher precision type of the field in the target object;
のようなエラーが出る、特にphrases
フィールドのことです、私は私の場合にはすべてのフィールドを定義した場合(ケースクラスを確認し、[2])それは
org.apache.spark.sql.AnalysisException: cannot resolve '`phrases`' due to data type mismatch: cannot cast StringType to ArrayType(StringType,true);
を取得クラス[2]型Stringとしてすべてうまく動作しますが、これは私が欲しいものではありません。それを行う簡単な方法はありますか?
参照
[1]例行
B017NX63A2,Merrell,"['merrell_for_men', 'merrell_mens_shoes', 'merrel']",merrell_shoes,0.0806054356579781
import spark.implicits._
val INPUT_TF = "<SOME_URI>/my_file.csv"
final case class TFFormat (
doc_id: String,
brand: String,
phrases: Seq[String],
prediction: String,
probability: Float
)
val ds = sqlContext.read
.option("header", "true")
.option("charset", "UTF8")
.csv(INPUT_TF)
.as[TFFormat]
ds.take(1).map(println)
[3]私は発見した方法を以下のように[2]私のコードスニペットであります最初にDataFrameレベルの列を定義し、データをDataseに変換することでt(hereまたはhereまたはhereのように)私はほとんどこれが行われることになっている方法ではないと確信しています。私はまた、エンコーダは、おそらくその答えであることをかなり確信しているが、私はどのように
ありがとうございます!もう1つの角度を追加するだけです:エンコーダーを使ってスキーマを推論することもできます: 'Encoders.product [TFFormat] .schema' –