web-dev-qa-db-ja.com

Spark:「プランが大きすぎたため、プランの文字列表現を切り捨てました。」手動で作成された集計式を使用する場合の警告

私は、ユーザーごとに1時間あたりの平均レコード数を含むベクトルを構築しようとしています。したがって、ベクトルには24次元が必要です。

私の元のDataFrameにはuserID列とhour列があり、groupByを実行し、次のようにユーザーごとの1時間あたりのレコード数をカウントすることから始めます。

val hourFreqDF = df.groupBy("userID", "hour").agg(count("*") as "hfreq")

今、ユーザーごとにベクトルを生成するために、私は this answerの最初の提案に基づいて、以下を実行しています。

val hours = (0 to 23 map { n => s"$n" } toArray)

val assembler = new VectorAssembler()
                     .setInputCols(hours)
                     .setOutputCol("hourlyConnections")

val exprs = hours.map(c => avg(when($"hour" === c, $"hfreq").otherwise(lit(0))).alias(c))

val transformed = assembler.transform(hourFreqDF.groupBy($"userID")
                           .agg(exprs.head, exprs.tail: _*))

この例を実行すると、次の警告が表示されます。

Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.

表現が長すぎるからだと思いますか?

私の質問は、この警告を安全に無視できますか?

25
Rami

SQLスキーマログの表示に関心がない場合は、無視しても問題ありません。それ以外の場合は、プロパティをより高い値に設定することもできますが、ジョブのパフォーマンスに影響する可能性があります。

spark.debug.maxToStringFields=100

デフォルト値:DEFAULT_MAX_TO_STRING_FIELDS = 25

幅広いスキーマの文字列を作成およびログに記録する際のパフォーマンスのオーバーヘッドは大きくなる可能性があります。影響を制限するために、デフォルトで含めるフィールドの数を制限しました。これは、SparkEnvで「spark.debug.maxToStringFields」confを設定することでオーバーライドできます。

から取得: https://github.com/Apache/spark/blob/master/core/src/main/scala/org/Apache/spark/util/Utils.scala#L9

34
radek1st