J'essaie de construire pour chacun de mes utilisateurs un vecteur contenant le nombre moyen d'enregistrements par heure. Par conséquent, le vecteur doit avoir 24 dimensions.
Mon DataFrame d'origine a userID
et hour
colonnes, et je commence par faire un groupBy
et compter le nombre d'enregistrements par utilisateur et par heure comme suit:
val hourFreqDF = df.groupBy("userID", "hour").agg(count("*") as "hfreq")
Maintenant, afin de générer un vecteur par utilisateur, je suis en train de suivre, en me basant sur la première suggestion de 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: _*))
Lorsque je lance cet exemple, je reçois l'avertissement suivant:
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.
Je présume que c'est parce que l'expression est trop longue?
Ma question est la suivante: puis-je ignorer cet avertissement en toute sécurité?
Vous pouvez l'ignorer en toute sécurité si vous ne souhaitez pas consulter les journaux de schéma SQL. Sinon, vous voudrez peut-être attribuer à la propriété une valeur plus élevée, mais cela pourrait affecter les performances de votre travail:
spark.debug.maxToStringFields=100
La valeur par défaut est: DEFAULT_MAX_TO_STRING_FIELDS = 25
La surcharge de performances liée à la création et à la journalisation de chaînes pour des schémas larges peut être importante. Pour limiter l'impact, nous avons lié le nombre de champs à inclure par défaut. Cela peut être annulé en définissant la configuration 'spark.debug.maxToStringFields' dans SparkEnv.
Extrait de: https://github.com/Apache/spark/blob/master/core/src/main/scala/org/Apache/spark/util/Utils.scala#L9