3

次のコンパイル時エラーが発生し続けます。

データセットに格納されているタイプのエンコーダが見つかりません。  
プリミティブ型 (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._

DataSetEncoderのドキュメントを見たことに注意してください。ドキュメントには、次のようなことが書かれています。

スカラ

エンコーダーは通常、
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:implicitsscala ファイル/ソースに配置しましたが、どちらも役に立ちません。

4

0 に答える 0