次のコードは、App特性を拡張してIdeaのrun
コマンドを使用して実行するオブジェクトの内部に置くと問題なく実行されます。私はワークシートからそれを実行してみたときにIntellij Ideaのスカラワークシート内でSparkを実行できない
はしかし、私はこれらのシナリオのいずれかが発生します。最初の行が存在する場合
1-、私が取得:直列化可能ではない
タスク:javaの。 io.NotSerializableException:A $ A34 $ A $ A34
2 - 最初の行がコメントアウトされている場合は、私が手:
このクラスが定義されたことをスコープに アクセスすることなく内部クラスのためのエンコーダA $ A35 $ A $ A35 $ A12を生成することができません。
//First line!
org.apache.spark.sql.catalyst.encoders.OuterScopes.addOuterScope(this)
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{IntegerType, StructField, StructType}
case class AClass(id: Int, f1: Int, f2: Int)
val spark = SparkSession.builder()
.master("local[*]")
.appName("Test App")
.getOrCreate()
import spark.implicits._
val schema = StructType(Array(
StructField("id", IntegerType),
StructField("f1", IntegerType),
StructField("f2", IntegerType)))
val df = spark.read.schema(schema)
.option("header", "true")
.csv("dataset.csv")
// Displays the content of the DataFrame to stdout
df.show()
val ads = df.as[AClass]
//This is the line that causes serialization error
ads.foreach(x => println(x))
プロジェクトは、アイデアのScalaのプラグインを使用して作成されました、これは私のbuild.sbtです:
...
scalaVersion := "2.10.6"
scalacOptions += "-unchecked"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.10" % "2.1.0",
"org.apache.spark" % "spark-sql_2.10" % "2.1.0",
"org.apache.spark" % "spark-mllib_2.10" % "2.1.0"
)
私はthis答えで解決策を試してみました。しかし、私が使用しているIdea Ultimate 2017.1ではうまくいきませんし、ワークシートを使用している場合は、できるだけ余分なオブジェクトをワークシートに追加したくありません。
データセットオブジェクトでcollect()
メソッドを使用し、 "Aclass"インスタンスの配列を取得すると、エラーはなくなります。エラーの原因となったDSを直接操作しようとしています。
見ます。 Eclipse互換モードをチェックしても問題は解決されませんでした。 – jrook