SparkSQL执行SQL触发ParseException:别名单引号问题求助
问题解决:SparkSQL ParseException 别名单引号错误
错误原因
Spark SQL里,单引号'仅用来表示字符串常量,不能定义列别名。你代码里用AS 'PhaseID'这种写法,会被SQL解析器当成字符串值,而非列的别名,直接触发语法解析错误。
解决方案
把列别名的单引号替换为反引号(`),无空格的别名也可以直接省略引号:
- 无空格别名(如PhaseID):
AS PhaseID - 带空格别名(如Phase Assignee):
ASPhase Assignee``
修改后的代码
query = f""" SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) + {pDimensionkey} AS ibfPhaseAssignmentKey, Base.* FROM ( SELECT DISTINCT Phase.lxOid AS PhaseID , TAName.mxFullname AS `Phase Assignee` , DurationAttr.lxVal AS `Phase Estimated Duration` , EstStartDate.lxVal AS `Phase Estimated Start Date` , EstFinishDate.lxVal AS `Phase Estimated Finish Date` , ActStartDate.lxVal AS `Phase Actual Start Date` , ActEndDate.lxVal AS `Phase Actual Completion Date` , relatedTask.lxOid AS `Related Object ID` , pr.ProjectId AS `Related Project ID` FROM lippertus_Enoviasilver.lxBO_49243908 Phase LEFT JOIN lippertus_Enoviasilver.mxBusType PhaseType ON PhaseType.mxOid = Phase.lxType AND Phase.lxType = '1071955709' LEFT JOIN lippertus_Enoviasilver.lxRO_49243908 TARO ON Phase.lxOid = TARO.lxToId AND TARO.lxType = '1968973284' LEFT JOIN lippertus_Enoviasilver.lxBO_49243908 TA ON TARO.lxFromId = TA.lxOid LEFT JOIN lippertus_Enoviasilver.mxUser TAName ON TA.lxName = TAName.mxName LEFT JOIN lippertus_Enoviasilver.mxBusType TAType ON TA.lxType = TAType.mxOid LEFT JOIN lippertus_Enoviasilver.lxReal_49243908 DurationAttr ON Phase.lxOid = DurationAttr.lxOid AND DurationAttr.lxType = '-668419160' LEFT JOIN lippertus_Enoviasilver.lxDate_49243908 EstStartDate ON Phase.lxOid = EstStartDate.lxOid AND EstStartDate.lxType = '-668414286' LEFT JOIN lippertus_Enoviasilver.lxDate_49243908 EstFinishDate ON Phase.lxOid = EstFinishDate.lxOid AND EstFinishDate.lxType = '-668416845' LEFT JOIN lippertus_Enoviasilver.lxDate_49243908 ActStartDate ON Phase.lxOid = ActStartDate.lxOid AND ActStartDate.lxType = '-308477270' LEFT JOIN lippertus_Enoviasilver.lxDate_49243908 ActEndDate ON Phase.lxOid = ActEndDate.lxOid AND ActEndDate.lxType = '1454168401' LEFT JOIN lippertus_Enoviasilver.lxRO_49243908 PhaseRel ON Phase.lxOid = PhaseRel.lxFromId LEFT JOIN lippertus_Enoviasilver.lxBO_49243908 relatedTask ON PhaseRel.lxToId = relatedTask.lxOid LEFT JOIN lippertus_Enoviasilver.lxRO_49243908 phasesRO ON phasesRO.lxToId = phase.lxOid LEFT JOIN lippertus_Enoviasilver.mxRelType projectRelType ON projectRelType.mxOid = phasesRO.lxType AND projectRelType.mxName = 'Subtask' LEFT JOIN empower.Project pr ON phasesRO.lxFromId = pr.ProjectId) Base""" source_query = spark.sql(query)
补充说明
你之前尝试的'''是Python的多字符串包裹语法,和SQL里的别名规则无关,所以解决不了问题。Spark SQL对标识符(别名、表名等)的规则是:
- 无特殊字符(空格、关键字)的标识符可以直接书写
- 带特殊字符或关键字的标识符必须用反引号包裹(兼容Hive语法)
内容的提问来源于stack exchange,提问作者Shuo Xu
相关产品推荐
相关产品推荐

