web-dev-qa-db-ja.com

Apache Spark:文字列列のインデックスを作成しようとするとStackOverflowError

約5000行950列のcsvファイルがあります。まず、DataFrameにロードします。

val data = sqlContext.read
  .format(csvFormat)
  .option("header", "true")
  .option("inferSchema", "true")
  .load(file)
  .cache()

その後、すべての文字列列を検索します

val featuresToIndex = data.schema
  .filter(_.dataType == StringType)
  .map(field => field.name)

それらにインデックスを付けたい。そのために、文字列列ごとにインデクサーを作成します

val stringIndexers = featuresToIndex.map(colName =>
  new StringIndexer()
    .setInputCol(colName)
    .setOutputCol(colName + "Indexed"))

パイプラインを作成します

val pipeline = new Pipeline().setStages(stringIndexers.toArray)

しかし、このパイプラインで最初のデータフレームを変換しようとすると

val indexedDf = pipeline.fit(data).transform(data)

StackOverflowErrorが発生します

16/07/05 16:55:12 INFO DAGScheduler: Job 4 finished: countByValue at StringIndexer.scala:86, took 7.882774 s
Exception in thread "main" Java.lang.StackOverflowError
at scala.collection.immutable.Set$Set1.contains(Set.scala:84)
at scala.collection.immutable.Set$Set1.$plus(Set.scala:86)
at scala.collection.immutable.Set$Set1.$plus(Set.scala:81)
at scala.collection.mutable.SetBuilder.$plus$eq(SetBuilder.scala:22)
at scala.collection.mutable.SetBuilder.$plus$eq(SetBuilder.scala:20)
at scala.collection.generic.Growable$class.loop$1(Growable.scala:53)
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:57)
at scala.collection.mutable.SetBuilder.$plus$plus$eq(SetBuilder.scala:20)
at scala.collection.TraversableLike$class.to(TraversableLike.scala:590)
at scala.collection.AbstractTraversable.to(Traversable.scala:104)
at scala.collection.TraversableOnce$class.toSet(TraversableOnce.scala:304)
at scala.collection.AbstractTraversable.toSet(Traversable.scala:104)
at org.Apache.spark.sql.catalyst.trees.TreeNode.containsChild$lzycompute(TreeNode.scala:86)
at org.Apache.spark.sql.catalyst.trees.TreeNode.containsChild(TreeNode.scala:86)
at org.Apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:280)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
...

私は何が間違っているのですか?ありがとう。

18
Andrew Tsibin

ある種の解決策を見つけたようです-use spark 2.0。以前は1.6.2を使用していました-これは発行時の最新バージョンでした。2.0のプレビューバージョンを使用しようとしました、しかし再現された問題もあります。

3
Andrew Tsibin

ほとんどの場合、すべてのスタックフレームを保持するのに十分なメモリがありません。 RandomForestModelをトレーニングすると、似たようなことが起こります。私にとって有効な回避策は、追加のパラメーターを使用してドライバーアプリケーション(Webサービス)を実行することです。

-XX:ThreadStackSize=81920 -Dspark.executor.extraJavaOptions='-XX:ThreadStackSize=81920'
5
evgenii