jjzjj

java - Spark SQL 失败,因为 "Constant pool has grown past JVM limit of 0xFFFF"

coder 2024-03-28 原文

我在 EMR 4.6.0 + Spark 1.6.1 上运行这段代码:

val sqlContext = SQLContext.getOrCreate(sc)
val inputRDD = sqlContext.read.json(input)

try {
    inputRDD.filter("`first_field` is not null OR `second_field` is not null").toJSON.coalesce(10).saveAsTextFile(output)
    logger.info("DONE!")
} catch {
    case e : Throwable => logger.error("ERROR" + e.getMessage)
}

saveAsTextFile 的最后阶段,它失败并出现以下错误:

16/07/15 08:27:45 ERROR codegen.GenerateUnsafeProjection: failed to compile: org.codehaus.janino.JaninoRuntimeException: Constant pool has grown past JVM limit of 0xFFFF
/* 001 */
/* 002 */ public java.lang.Object generate(org.apache.spark.sql.catalyst.expressions.Expression[] exprs) {
/* 003 */   return new SpecificUnsafeProjection(exprs);
/* 004 */ }
(...)

可能是什么原因?谢谢

最佳答案

通过删除 Dataframe 中所有未使用的列或仅过滤您实际需要的列来解决此问题。

原来 Spark Dataframe 无法处理超宽模式。没有具体的列数,Spark 可能会因“常量池已超过 0xFFFF 的 JVM 限制”而中断 - 这取决于查询的类型,但减少列数有助于解决此问题。

根本原因在于 JVM 的 64kb 生成的 Java 类 - 另请参阅 Andrew 的回答。

关于java - Spark SQL 失败,因为 "Constant pool has grown past JVM limit of 0xFFFF",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38391863/

有关java - Spark SQL 失败,因为 "Constant pool has grown past JVM limit of 0xFFFF"的更多相关文章

随机推荐