2016-11-21 153 views
3

試圖創建基於這樣如何根據條件添加新列(不面臨JaninoRuntimeException或OutOfMemoryError)?

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 

此問題的條件與多個附加列火花數據幀在其他地方也有報道

是否有火花的屬性在那裏我可以配置的大小?

編輯

如果創建了更多列,例如,大約20我也不再收到上述異常,但5分鐘後等待而得到以下錯誤:

java.lang.OutOfMemoryError: GC overhead limit exceeded 

我要表演的是拼寫/糾錯。一些簡單的案例可以通過UDF中的地圖&替換輕鬆處理。儘管如此,仍然存在多個鏈接條件的其他情況。

我也將跟進有:https://issues.apache.org/jira/browse/SPARK-18532

一個最小的可重複的例子可以在這裏https://gist.github.com/geoHeil/86e5401fc57351c70fd49047c88cea05

回答

2

發現此錯誤是由WholeStageCodegen和JVM問題引起的。

快速回答:不,您無法更改限制。請看this的問題,64KB是JVM中的最大方法大小。

我們必須等待在Spark中找到解決方法,目前沒有什麼可以在系統參數中進行更改