rdd.toDS
を使用してRDDをデータセットに変換できることを理解します。しかし、rdd.toDF
も存在します。実際には他のものよりも利点がありますか?スパークのtoDSとDF
Dataset APIで1日プレイした後、ほとんどの操作でDataFrame(たとえばwithColumn
)が表示されます。 toDS
でRDDを変換した後、DataSetへの別の変換が必要になることがよくあります。
私は間違ってAPIを使用していますか?私は.toDFに固執し、一連の操作の最後にDataSetに変換するだけでいいですか?または、以前にtoDSを使用する利点がありますか?ここ
が
spark
.read
.schema (...)
.json (...)
.rdd
.zipWithUniqueId
.map[(Integer,String,Double)] { case (row,id) => ... }
.toDS // now with a Dataset API (should use toDF here?)
.withColumnRenamed ("_1", "id") // now back to a DataFrame, not type safe :(
.withColumnRenamed ("_2", "text")
.withColumnRenamed ("_2", "overall")
.as[ParsedReview] // back to a Dataset
DATAFRAMEが '' 'データセット' ''のためだけのエイリアスです - Databricksは、データセット/データフレームのに関するいくつかのコンテンツを持っていますhttps://docs.databricks.com/spark/latest/dataframes-datasets/index.html また、agildataには構文に関するクイックプライマリがあります。http://www.agildata.com/apache-spark-rdd-vs-dataframe-vs-dataset/ 可能な限り2つの間の変換を避けることをお勧めします。あなたがDataFrameのコンテンツに興味があるなら、それらを使用してください。しかし、あなたがそれを振ることができるならば、Datasetはしばしばより最適になります。実際、DataFrameの代わりにタイプDataset を使用しても問題ありません。 –
Garren
コメントとポインタをありがとう。私はこれが単なるエイリアスであることを理解しています。私は、Dataframe APIの型なしの性質が嫌いです。ほとんどのエラーは実行時に報告され、これはフレームワークを学習している人にとっては本当の苦痛です。多型データセットに留まる方法に関するいくつかのガイドラインがありますか? (上記の例のようにタイプを緩めたり元に戻したりする必要はありません) –
指定した値の一部のみを使って '' 'Dataset' ''を作成し、それらの値を変更できるはずですsetterを使ってオブジェクトに対して '' map''を呼び出すことで、あなたが与えた例は、おそらくあなたのものと同じくらい私には分かりません。 withColumnRenamedのような便利なメソッドを使用すると、動的列の名前変更を簡単にするために、データセットの型安全性を犠牲にすることを意味します。検討する価値のあるものの1つは、データセット/DataFrame値で相対的な型の安全性を提供する '' 'row.getString(row.fieldIndex(" column_name "))' ''構文を使用することです。 –
Garren