SparkSQL列数量比较多引发的Too many arguments in method signature in class file问题

这篇具有很好参考价值的文章主要介绍了SparkSQL列数量比较多引发的Too many arguments in method signature in class file问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题描述

我在写一个Spark程序的时候,做两个表的关联,其中一个表为feature表,一共有96个特征,我使用下面的 代码片 的时候

val geoCols = geoVec.columns.filterNot(c => Seq("geohash", "province", "zone_id").contains(c))

    val aggCols = geoCols.map(colName => sum(col(colName) * col("num_dwells")) as colName)
    val result = userPoi
      .join(broadcast(geoVec), Seq("geohash","zone_id","province"), "inner")
      .groupBy("user_id", "date_dt")
      .agg(aggCols.head, aggCols.tail: _*)

在运行的时候会报错

java.lang.ClassFormatError: org/apache/spark/sql/catalyst/expressions/GeneratedClass$GeneratedIteratorForCodegenStage5
	at org.apache.spark.sql.catalyst.expressions.GeneratedClass.generate(Unknown Source)
	at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10.apply(WholeStageCodegenExec.scala:610)
	at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10.apply(WholeStageCodegenExec.scala:608)
	at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:847)
	....

在运行日志里面还有下面的错误提示

java.lang.ClassFormatError: Too many arguments in method signature in class file org/apache/spark/sql/catalyst/expressions/GeneratedClass$GeneratedIteratorForCodegenStage5

2. 解决办法

增加一行:
.config("spark.sql.codegen.wholeStage", value = false)

初始化Spark环境的时候
val spark = SparkSession.builder()
      .appName("xxx")
      .config("spark.sql.codegen.wholeStage", value = false)
      .enableHiveSupport()
      .getOrCreate()

3. 原因简单剖析

这个错误一般是由于 JVM 的方法参数限制所导致的。JVM 对于方法的参数数量有一定的限制,通常情况下,方法的参数数量不应该超过 255 个。如果一个方法的参数数量超过了这个限制,JVM 就会抛出类似于 “Too many arguments in method signature” 的错误。
在 Spark 中,这个错误通常是由于代码生成器生成的代码包含了过多的参数所导致的。这个问题可以通过减少参数数量来解决。你可以尝试以下几种方法来解决这个问题:
减少参数数量:可以尝试将参数数量减少到 JVM 可以接受的范围内。如果你的代码中包含了过多的参数,可以考虑将一部分参数合并为一个对象,或者使用 Spark 的 Tuple 类型来代替。
禁用代码生成器:你可以尝试在 SparkSession 上设置 spark.sql.codegen.wholeStage 参数为 false,以禁用 Spark 的代码生成器,并在运行时使用解释器执行查询。这样可以避免生成的代码过于复杂,从而导致参数数量过多。
我的程序并没有超过255个参数,或许是中间过程产生了临时参数比较多,加起来超过了255个,但是并没有足够的时间去验证。

询问GPT得到的另外一个解释是:
如果在 Spark 2.x 中传递的参数数量超过了 JVM 的参数数量限制(约为 64KB),就会出现 Too many arguments in method signature 错误。这个错误通常是由于聚合表达式太多而导致的。也可能我的命名太长了,但是感觉很难超过64KB,需要打印相关的解析参数才可以确定,但是基本上可以确定的是参数数量较多导致的。

4. 其他解决方案

GPT给的方案:

为了避免这个问题,你可以尝试将聚合表达式分成多个小组,并分批执行聚合操作。具体来说,你可以将聚合表达式分成若干组,每组包含 10 到 20 个聚合表达式,然后分别使用 agg 函数执行聚合操作,并将结果合并起来。示例代码如下:

val aggCols = geoCols.map(colName => sum(col(colName) * col("num_dwells")) as colName)

val numGroups = (aggCols.length + 10 - 1) / 10 // 每组包含 10 个聚合表达式
val groupIndexes = (0 until numGroups).map(i => i * 10)
val groupCols = groupIndexes.map(i => aggCols.slice(i, i + 10))

val results = groupCols.map(cols => {
  userPoi
    .join(broadcast(geoVec), Seq("geohash","zone_id","province"), "inner")
    .groupBy("user_id", "date_dt")
    .agg(cols.head, cols.tail: _*)
})

val result = results.reduce((df1, df2) => df1.join(df2, Seq("user_id", "date_dt"), "inner"))

这个代码将聚合表达式分成了多个小组,并分别使用 agg 函数执行聚合操作。最后,将结果使用 join 函数合并起来。这样可以避免参数数量过多而导致的编译器错误。

由于在搜索引擎和stackoverflow上并不能很容易搜到解决方案,所以写篇日志记录下来,希望对遇到该问题的人有所帮助。文章来源地址https://www.toymoban.com/news/detail-474483.html

到了这里,关于SparkSQL列数量比较多引发的Too many arguments in method signature in class file问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch Too many dynamic script 问题

    报错: Caused by: ElasticsearchException [Elasticsearch exception [type=circuit_breaking_exception, reason=[script]  Too many dynamic script compilations within, max: [75/5m];  please use indexed, or scripts with parameters instead;  this limit can be changed by the [script.max_compilations_rate] setting]]   解决方案:更

    2024年02月16日
    浏览(36)
  • MySQL提示“too many connections“的解决方法

     最近使用mysql8.0.23的时候连接数据库时发现提示报错,出现mysql too many connection 的异常。经过查询发现是mysql的系统自带的连接数太小,连接的线程超过系统配置导致出现错误。 1. 首先登录mysql终端,输入 show variables like \\\"max_connections\\\"; ,查看最大连接数。 修改最大连接数:

    2024年02月16日
    浏览(45)
  • Mysql报错:too many connections原因及解决方法

    1、原因是mysql连接数过多 解决方案: 1、linux登录mysql: 2、查看mysql允许的最大连接数 3、查看这次mysql服务启动到现在,同一时刻最多mysql有多少连接 4、修改mysql最大连接数 5、以上步骤修改后虽然能登录,但仍有隐患,我们应该把那些sleep的连接杀掉 (1)查看所有连接状态

    2024年02月10日
    浏览(59)
  • ES执行报错:too_many_clause

    问题原因: bool 查询拼接太多了,有一个拼接上限,es默认设置为1024 解决方法:

    2024年02月12日
    浏览(78)
  • 记一次Kafka 故障Too many open files问题

    查看日志发现,有kafka日志报错提示: 查看limit.conf文件,发现文件打开数设置的值也没问题,尝试增大值后,但就是提示Too many open files,报错就是文件打开数过多。 经不懈的百度百度,发现如下图两条关键信息; systemd 服务 模块 最大打开文件数默认为1024,查看其他没改动

    2024年02月13日
    浏览(46)
  • ElasticSearch|too_many_buckets_exception解决方法

    报错信息 ES 执行聚合查询时报错,报错信息如下: 原因定位 因为聚合查询的桶数超过了 ES 集群配置的最大桶数的上限。ES 聚合查询最大桶数的参数文档如下(地址): search.max_buckets (Dynamic, integer) Maximum number of aggregation buckets allowed in a single response. Defaults to 65,536. Requests t

    2024年02月04日
    浏览(40)
  • too many open files(打开的文件过多)解决方法

    https://www.cnblogs.com/conanwang/p/5818441.html SU: failed to execute /bin/bash:系统中打开的文件过多 too many open files(打开的文件过多)是Linux系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端

    2024年02月16日
    浏览(47)
  • ssh 连接错误 Too many authentication failures 解决方法

    有时候使用 ssh 登录 或者 git ssh 方式连接 时会遇到: Too many authentication failures 这个错误的原因是客户端尝试连接次数大于服务端限制的次数。 默认情况下: ssh 客户端会按照认证顺序: 1. 依次尝试 ssh-agent 中的秘钥和配对~/.ssh 的秘钥对 2. 如果都失败了会尝试密码登录 如果

    2024年02月01日
    浏览(38)
  • PostgreSQL Error: sorry, too many clients already

    PG的默认最大连接数是100. 如果超过100就会报错 sorry, too many clients already 提高最大连接数 查看程序,减少从未关闭连接的函数 修改事务时间,减少事务未提交带来的问题

    2024年02月11日
    浏览(158)
  • 导入失败,报错:“too many filtered rows xxx, “ErrorURL“:“

    一、问题: 注:前面能正常写入,突然就报错,导入失败,报错:“too many filtered rows xxx, \\\"ErrorURL\\\":\\\" {\\\"TxnId\\\":769494,\\\"Label\\\":\\\"datax_doris_writer_bf176078-15d7-414f-8923-b0eb5f6d5da1\\\",\\\"TwoPhaseCommit\\\":\\\"false\\\",\\\"Status\\\":\\\"Fail\\\",\\\"Message\\\":\\\" [INTERNAL_ERROR]too many filtered rows\\\",\\\" NumberTotalRows\\\":325476,\\\"NumberLoadedRows\\\":325473,\\\"

    2024年01月18日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包