Databricks Notebook中PySpark代码执行报错求助:NullPointerException
错误信息(中文翻译)
在调用o508.sql时发生错误。
: java.lang.NullPointerException
at org.antlr.v4.runtime.CharStreams.fromString(CharStreams.java:222)
at org.antlr.v4.runtime.CharStreams.fromString(CharStreams.java:212)
at com.databricks.sql.parser.DatabricksSqlParser.parse(DatabricksSqlParser.scala:83)
at com.databricks.sql.parser.DatabricksSqlParser.parsePlan(DatabricksSqlParser.scala:74)
at org.apache.spark.sql.SparkSession.$anonfun$sql$2(SparkSession.scala:818)
at com.databricks.spark.util.FrameProfiler$.record(FrameProfiler.scala:80)
at org.apache.spark.sql.catalyst.QueryPlanningTracker.measurePhase(QueryPlanningTracker.scala:344)
at org.apache.spark.sql.SparkSession.$anonfun$sql$1(SparkSession.scala:818)
at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:985)
at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:815)
at sun.reflect.GeneratedMethodAccessor760.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380)
at py4j.Gateway.invoke(Gateway.java:306)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:195)
at py4j.ClientServerConnection.run(ClientServerConnection.java:115)
at java.lang.Thread.run(Thread.java:750)
问题根源
该异常是ANTLR SQL解析器尝试从空字符串创建字符流时触发的空指针,本质是传递给spark.sql()的SQL语句无效(为空或未正确赋值)。
解决方案
- 检查SQL参数有效性:确保调用
spark.sql()时传入的不是空字符串、None或未初始化的变量。
错误示例:
修正:sql_query = "" spark.sql(sql_query) # 传入空字符串触发异常sql_query = "SELECT * FROM your_target_table" spark.sql(sql_query) - 校验动态生成的SQL:如果通过字符串拼接生成SQL,确认所有变量都有有效值,避免拼接出空或语法错误的SQL。
错误示例:
修正:先校验变量值,再执行拼接操作。table_name = "" sql_query = f"SELECT * FROM {table_name}" # 拼接后SQL无效 - 验证SQL语法合法性:将SQL语句复制到Databricks SQL编辑器中执行,确认语法无问题,排除语法错误导致的解析失败。
- 排查变量引用问题:检查代码中传递给
spark.sql()的变量是否被意外覆盖、置空,确保变量指向正确的SQL字符串。
内容的提问来源于stack exchange,提问作者srv

