1. ホーム
  2. apache-spark

[解決済み] スパーク "プランの文字列表現が大きすぎたため、切り捨てました。" 手動で作成した集計式を使用した場合の警告

2022-02-05 18:10:18

質問

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

私のオリジナルのDataFrameは userIDhour カラムを作成することから始めています。 groupBy で、1時間あたりの1ユーザーあたりのレコード数を次のようにカウントしています。

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

さて、ユーザーごとのベクトルを生成するために、私は以下のようにしています。 これ の回答です。

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.

これは、式が長すぎるためだと推測されますが?

質問ですが、この警告は無視して大丈夫ですか?

解決方法を教えてください。

SQLスキーマのログを見ることに興味がないのであれば、無視しても大丈夫です。そうでなければ,このプロパティをより高い値に設定したいかもしれませんが,ジョブのパフォーマンスに影響を与えるかもしれません.

spark.debug.maxToStringFields=100

デフォルト値は DEFAULT_MAX_TO_STRING_FIELDS = 25

文字列の作成とロギングに伴うパフォーマンスのオーバーヘッド のスキーマの幅が大きくなる可能性があります。この影響を抑えるために、私たちは デフォルトで含まれるフィールドの数。これは以下の方法で上書きすることができます。 SparkEnv.Confに 'spark.debug.maxToStringFields' を設定します。

から引用しています。 https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/util/Utils.scala#L90