问题
您正在使用DBConnect (AWS|Azure|GCP)来运行一个PySpark变换与超过100列DataFrame当你得到一个堆栈溢出错误。
py4j.protocol。Py4JJavaError:调用o945.count时发生一个错误。:. lang。在java.lang.Class.getEnclosingClass StackOverflowError java.lang.Class.getEnclosingMethodInfo (Class.java: 1072) (Class.java: 1272) java.lang.Class.getSimpleBinaryName (Class.java: 1443) java.lang.Class.getSimpleName (Class.java: 1309) org.apache.spark.sql.types.DataType.typeName (DataType.scala: 67) org.apache.spark.sql.types.DataType.simpleString (DataType.scala: 82) org.apache.spark.sql.types.DataType.sql (DataType.scala: 90) org.apache.spark.sql.util.ProtoSerializer.serializeDataType (ProtoSerializer.scala: 3207) org.apache.spark.sql.util.ProtoSerializer.serializeAttrRef (ProtoSerializer.scala: 3610) org.apache.spark.sql.util.ProtoSerializer.serializeAttr (ProtoSerializer.scala: 3600) org.apache.spark.sql.util.ProtoSerializer.serializeNamedExpr (ProtoSerializer.scala: 3537) org.apache.spark.sql.util.ProtoSerializer.serializeExpr (ProtoSerializer.scala: 2323) org.apache.spark.sql.util.ProtoSerializer anonfun nestedInanonfun serializeCanonicalizable美元美元1美元1.美元applyorelse (ProtoSerializer.scala: 3001) org.apache.spark.sql.util.ProtoSerializer anonfun nestedInanonfun serializeCanonicalizable美元美元1美元1.美元applyorelse (ProtoSerializer.scala: 2998)
笔记本电脑工作正常,执行相同的操作不会产生一个错误。
示例代码
你可以用这个样本代码复制错误。
它会创建一个与200年DataFrame列和重命名。
这个示例代码中正确运行一个笔记本,但在DBConnect运行时导致一个错误。
% python df = spark.createDataFrame ([{str (i):我因为我在范围(2000)}))df = spark.createDataFrame ([{str (i):我因为我在范围(200)}))在df坳。列:df = df。withColumnRenamed(坳坳+ _a) df.collect ()
导致
DBConnect运行代码时,一些函数处理远程集群上的司机,但一些处理客户机本地电脑。
如果没有足够的内存分配在本地电脑,你得到一个错误。
解决方案
你应该增加内存分配给Apache引发司机在本地PC上。
- 运行databricks-connect get-spark-home在您的本地电脑的$ {spark_home}价值。
- 导航到$ {spark_home} / conf /文件夹中。
- 打开spark-defaults.conf文件。
- 添加以下设置spark-defaults.conf文件:
spark.driver。内存4 g spark.driver。extraJavaOptions -Xss32M
- 保存更改。
- 重启DBConnect。