問題
您正在使用DBConnect (AWS|Azure|GCP當你得到一個堆棧溢出錯誤時,在一個超過100列的DataFrame上運行PySpark轉換。
py4j.protocol。Py4JJavaError:調用o945.count時發生錯誤。:java.lang.StackOverflowError at java.lang.Class.getEnclosingMethodInfo(Class.java:1072) at java.lang.Class.getEnclosingClass(Class.java:1272) at java.lang.Class.getSimpleBinaryName(Class.java:1443) at java.lang. class . getsimplaryename (Class.java:1309) at org.apache.spark.sql.types.DataType.typeName(DataType.scala:67) at org.apache.spark.sql.types.DataType.simpleString(DataType.scala:82) at org.apache.spark.sql.types.DataType.sql(DataType.scala:90) atorg.apache.spark.sql.util.ProtoSerializer.serializeDataType(ProtoSerializer.scala:3207) at org.apache.spark.sql.util.ProtoSerializer.serializeAttrRef(ProtoSerializer.scala:3610) at org.apache.spark.sql.util.ProtoSerializer.serializeAttr(ProtoSerializer.scala:3600) at org.apache.spark.sql.util.ProtoSerializer.serializeAttr(ProtoSerializer.scala: 3537) at org.apache.spark.sql.util.ProtoSerializer.serializeExpr(ProtoSerializer.scala:2323) atorg.apache.spark.sql.util.ProtoSerializer$$anonfun$$nestedInanonfun$ 1$1. applyorelse (ProtoSerializer.scala:3001) at org.apache.spark.sql.util.ProtoSerializer$$anonfun$$nestedInanonfun$serializeCanonicalizable$1$1. applyorelse (ProtoSerializer.scala:2998)
在筆記本上執行相同的操作是正確的,不會產生錯誤。
示例代碼
您可以使用這個示例代碼重現錯誤。
它創建了一個包含200列的DataFrame,並將它們全部重命名。
這個示例代碼在筆記本電腦中正確運行,但在DBConnect中運行時會出現錯誤。
%python df = spark.createDataFrame([{str(i): i for i in range(2000)}]) df = spark.createDataFrame([{str(i): i for i in range(200)}]) for col in df。列:df = df。withcolumnrename (col, col + "_a") df.collect()
導致
在DBConnect中運行代碼時,有些函數在遠程集群驅動程序上處理,但有些函數在客戶機PC上本地處理。
如果本地PC上沒有分配足夠的內存,將會得到一個錯誤。
解決方案
該任務指導管理員增加本地PC為Apache Spark驅動分配的內存。
- 運行databricks-connect get-spark-home在您的本地PC上獲取$ {spark_home}價值。
- 導航到$ {spark_home} / conf /文件夾中。
- 打開spark-defaults.conf文件。
- 將以下設置添加到spark-defaults.conf文件:
spark.driver.extraJavaOptions -Xss32M .memory 4g
- 保存更改。
- 重啟DBConnect。