Spark:"截断了计划的字符串表示,因为它太大了。"使用手动创建的聚合表达式时发出警

时间:2017-05-03 12:21:35

标签: apache-spark spark-dataframe

我正在尝试为每个用户构建一个包含每小时每小时平均记录数的向量。因此,矢量必须有24个维度。

我的原始DataFrame包含userIDhour列,我首先执行groupBy并计算每小时每位用户的记录数,如下所示:

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

现在,为了根据this回答中的第一个建议,我按照每个用户生成一个向量。

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.

我认为这是因为表达式太长了?

我的问题是:我可以安全地忽略此警告吗?

2 个答案:

答案 0 :(得分:29)

如果您对查看sql架构日志不感兴趣,可以放心地忽略它。否则,您可能希望将属性设置为更高的值,但它可能会影响作业的性能:

spark.debug.maxToStringFields=100

默认值为:DEFAULT_MAX_TO_STRING_FIELDS = 25

  

创建和记录字符串的性能开销   对于宽模式可能很大。为了限制影响,我们限制了   默认情况下要包括的字段数。这可以被覆盖   设置' spark.debug.maxToStringFields' conf在SparkEnv。

取自:https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/util/Utils.scala#L90

答案 1 :(得分:1)

此配置以及其他许多配置已移至:SQLConf-sql/catalyst/src/main/scala/org/apache/spark/sql/internal/SQLConf.scala

可以在配置文件中或通过spark中的命令行使用以下方式设置

spark.conf.set("spark.sql.debug.maxToStringFields", 1000)