私は、ユーザーごとに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.
表現が長すぎるからだと思いますか?
私の質問は、この警告を安全に無視できますか?
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