次のコンパイル時エラーが発生し続けます。
データセットに格納されているタイプのエンコーダが見つかりません。 プリミティブ型 (Int、String など) と Product 型 (ケース クラス) spark.implicits._ をインポートすることでサポートされます 他のタイプのシリアル化のサポートは、将来のリリースで追加される予定です。
Spark v1.6 から v2.0.2 にアップグレードしたところ、使用している多数のコードDataFrame
がこのエラーについて不平を言っています。文句を言っているコードは次のようになります。
def doSomething(data: DataFrame): Unit = {
data.flatMap(row => {
...
})
.reduceByKey(_ + _)
.sortByKey(ascending = false)
}
以前の SO の投稿は、
DataFrame
ただし、 which is equal to を使用しているため、ケースクラスはありませんDataSet[Row]
。また、このメッセージを取り除くための助けを借りずに、次のように2つの暗黙的なインポートをインライン化しました。
val sparkSession: SparkSession = ???
val sqlContext: SQLContext = ???
import sparkSession.implicits._
import sqlContext.implicits._
DataSetとEncoderのドキュメントを見たことに注意してください。ドキュメントには、次のようなことが書かれています。
スカラ エンコーダーは通常、 SparkSession、または静的メソッドを呼び出して明示的に作成できます エンコーダー。 import spark.implicits._ val ds = Seq(1, 2, 3).toDS() // 暗黙的に提供される (spark.implicits.newIntEncoder)
ただし、私のメソッドにはアクセスできませんSparkSession
。また、その行を試してみるとimport spark.implicits._
、IntelliJ はそれを見つけることさえできません。私の DataFrame が DataSet[Row] であると言うとき、私は本当にそれを意味します。
この質問は重複の可能性があるとマークされていますが、明確にしてください。
- ケース クラスまたはビジネス オブジェクトが関連付けられていません。
- 私は .flatMap を使用していますが、他の質問は .map を使用しています
- 暗黙のインポートは役に立たないようです
- RowEncoder を渡すとコンパイル時エラーが発生する
data.flatMap(row => { ... }, RowEncoder(data.schema))
(引数が多すぎる)
私は他の投稿を読んでいますが、追加させてください。この新しい Spark 2.0 Datasets/DataFrame API がどのように機能するのかわかりません。Spark シェルでは、以下のコードが機能します。このようにスパークシェルを開始することに注意してください$SPARK_HOME/bin/spark-shell --packages com.databricks:spark-csv_2.10:1.5.0
val schema = StructType(Array(
StructField("x1", StringType, true),
StructField("x2", StringType, true),
StructField("x3", StringType, true),
StructField("x4", StringType, true),
StructField("x5", StringType, true)))
val df = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.schema(schema)
.load("/Users/jwayne/Downloads/mydata.csv")
df.columns.map(col => {
df.groupBy(col)
.count()
.map(_.getString(0))
.collect()
.toList
})
.toList
ただし、これをテスト ユニットの一部として実行すると、同じ「エンコーダーが見つかりません」というエラーが発生します。これがシェルでは機能するのに、テスト ユニットでは機能しないのはなぜですか?
シェルで、入力し:imports
て:implicits
scala ファイル/ソースに配置しましたが、どちらも役に立ちません。