Databricks中Spark SQL用format()执行查询遇解析异常求助
Spark SQL动态传入表名触发解析异常的排查与原因
问题复现
手动指定FROM子句表名时代码可正常运行:
TS353_mnf_knee_hip_shld_mon = spark.sql("""select dt.supplier, dt.month, dt.year, dt.supplier_id, dt.catalogue_code, dt.normalized_catalogue_code, dt.type_of_business, z.zip, z.zip3, dt.zip9, z.div_cens_nm, z.st_cd, z.region_cens_nm, sum(dt.sales) as Sales, sum(dt.quantity) as quantity from ds_output.TS353_mnf_knee_hip_shld_testzip9 dt inner join {0} z on dt.zip=z.zip where z.st_cd not in ('PR','VI','GU','MH','AS','MP','AP') group by dt.supplier, dt.month, dt.year, dt.supplier_id, dt.catalogue_code, dt.normalized_catalogue_code, dt.type_of_business, z.zip, z.zip3, dt.zip9, z.div_cens_nm, z.st_cd, z.region_cens_nm""".format(zip_ref))
但将主表名通过变量传入format()时触发解析异常:
TS353_mnf_knee_hip_shld = 'ds_output.TS353_mnf_knee_hip_shld_testzip9' TS353_mnf_knee_hip_shld_mon = spark.sql("""select dt.supplier, dt.month, dt.year, dt.supplier_id, dt.catalogue_code, dt.normalized_catalogue_code, dt.type_of_business, z.zip, z.zip3, dt.zip9, z.div_cens_nm, z.st_cd, z.region_cens_nm, sum(dt.sales) as Sales, sum(dt.quantity) as quantity from {0} dt inner join {1} z on dt.zip=z.zip where z.st_cd not in ('PR','VI','GU','MH','AS','MP','AP') group by dt.supplier, dt.month, dt.year, dt.supplier_id, dt.catalogue_code, dt.normalized_catalogue_code, dt.type_of_business, z.zip, z.zip3, dt.zip9, z.div_cens_nm, z.st_cd, z.region_cens_nm""".format(TS353_mnf_knee_hip_shld, zip_ref))
可能的原因与排查方法
- 变量内容存在格式问题:检查
TS353_mnf_knee_hip_shld变量的字符串是否包含多余空格、换行或特殊字符。比如变量定义时末尾误加空格,替换后会出现from ds_output.TS353_mnf_knee_hip_shld_testzip9 dt(双空格)的情况,部分解析器可能因此触发异常。 - 格式化后SQL语法不一致:先将格式化后的SQL打印出来,与手动编写的正确版本对比:
重点核对sql_query = """select ... 你的SQL内容 ...""".format(TS353_mnf_knee_hip_shld, zip_ref) print(sql_query)from {0} dt替换后的部分,确认表名拼写、点分隔符与手动版本完全一致。 - 表名需标识符包裹:若表名/数据库名包含特殊字符(如空格、关键字),动态传入时需用反引号包裹,修改SQL模板为:
from `{0}` dt - 变量传递顺序错误:确认
format()的参数顺序与SQL模板中的{0}、{1}占位符完全对应,顺序颠倒会导致表名替换到错误位置,触发语法错误。
内容的提问来源于stack exchange,提问作者Dr.Data
相关产品推荐
相关产品推荐

