如何根据条件添加新列(不涉及JaninoRuntimeException或OutOfMemoryError)?

时间:2016-11-21 19:42:04

标签: apache-spark apache-spark-sql

尝试根据此类条件创建包含多个附加列的火花数据框

df
    .withColumn("name1", someCondition1)
    .withColumn("name2", someCondition2)
    .withColumn("name3", someCondition3)
    .withColumn("name4", someCondition4)
    .withColumn("name5", someCondition5)
    .withColumn("name6", someCondition6)
    .withColumn("name7", someCondition7)

如果添加了超过6个.withColumn子句,我将面临以下异常

org.codehaus.janino.JaninoRuntimeException: Code of method "()V" of class "org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator" grows beyond 64 KB

此问题也已在其他地方报道,例如。

我可以在spark中配置属性吗?

修改

如果创建更多列,例如在20左右,我不再收到上述异常,而是在等待5分钟后得到以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我想要执行的是拼写/纠错。一些简单的案例可以通过地图&在UDF中替换。尽管如此,其他几个具有多种链条条件的案例仍然存在。

我也会跟进:https://issues.apache.org/jira/browse/SPARK-18532

这里可以找到一个可重现性最小的例子https://gist.github.com/geoHeil/86e5401fc57351c70fd49047c88cea05

1 个答案:

答案 0 :(得分:2)

此错误是由WholeStageCodegen和JVM问题引起的。

快速回答:不,你不能改变限制。请查看this问题,64KB是JVM中的最大方法大小。

我们必须等待Spark中的解决方法,目前您无法在系统参数中进行任何更改