0

いくつかの方法Spark2.0で、私は問題Spark2.0のDataset.map(r => xx)とDataframe.map(r => xx)の違いは何ですか?

しかしDataSet.map(r => r.getAs[String]("field"))rは「のGetAs」メソッドを持っていないことを示すエラーを与えることなく、Dataframe.map(r => r.getAs[String]("field"))を使用することができます。

DataFrameDataSetrrの違いだとr.getAsDataFrameで動作しますなぜですか? class Dataset[T]

にStackOverflowでいくつかの研究を行った後、私はここに

Encoder error while trying to map dataframe row to updated row

を有用な答えを見つけたが、それは

+2

あなたのデータセットのタイプは何ですか? 'getAs'は' Row'のメソッドですので 'r.getAs'は' r'が 'Row'です(つまり、あなたのデータセットは' DataSet [Row] 'です、' DataFrame'はちょうど'DataSet [Row]'のエイリアス) – puhlen

+0

ありがとう。私はデータセット[_]を使用しました。 DataSet.map(r => xx)を実行すると、rとは何ですか?それはデータの行ですか? @puhlen – rileyss

+0

いいえ、あなたがタイプを指定しなかったので 'r'は' Any'です – puhlen

答えて

3

Datasetは型パラメータを持っていると便利です願っています。 Tは、データセット内の各レコードのタイプです。そのTは何でもかまいません(暗黙のうちにEncoder[T]を提供できるものはありますが、その点以外にもあります)。 Dataset

map操作は、各レコードに提供される関数を適用し、あなたが示したマップ操作でrはタイプTを持つことになります。

最後にDataFrameは、実際にはDataset[Row]のエイリアスです。つまり、各レコードのタイプはです。 にはgetAsという名前のメソッドがあり、タイプパラメータと文字列引数をとるため、にはgetAs[String]("field")を呼び出すことができます。この方法を持たないTについては、これはコンパイルに失敗します。

関連する問題