如何通过PySpark JDBC连接器删除Teradata数据库表?
问题:PySpark通过JDBC无法删除Teradata表,jaydebeapi却可行
- 可以用PySpark的JDBC方式查询Teradata数据库,但无法执行删除表操作
- 同一个Spark会话中,使用jaydebeapi能成功删除目标表
出错代码示例
drop_sql = """(DROP TABLE <DB_NAME>.<TABLENAME>)""" conn = spark.read \ .format("jdbc") \ .option("driver","com.teradata.jdbc.TeraDriver") \ .option("url","jdbc:teradata://<IP_ADDRESS>/DATABASE=. <DB_NAME>,TMODE=ANSI,CHARSET=UTF8,TYPE=FASTLOAD,LOGMECH=LDAP") \ .option("query", drop_sql) \ .option("user", user) \ .option("password",password)\ .option("fetchsize",10000).load()
报错信息(翻译后)
Py4JJavaError: 调用o265.load时出错。: java.sql.SQLException: [Teradata数据库] [TeraJDBC 17.20.00.15] [错误3707] [SQLState 42000] 语法错误,预期在'('和'DROP'关键字之间出现名称、Unicode分隔标识符、'UDFCALLNAME'关键字、'SELECT'关键字或'('。
解决方法
核心问题
Spark的spark.read.jdbc(或spark.read.format("jdbc"))是专门用来执行查询类SQL语句(即返回结果集的SELECT类语句)的接口,而DROP TABLE属于DDL语句,不会返回结果集,因此不能用这个接口执行。另外你写的drop_sql多了一层冗余括号,本身也是语法错误。
正确执行方式
直接通过Spark获取JDBC连接,执行DDL语句:
from pyspark.sql import SparkSession # 假设已初始化SparkSession spark = SparkSession.builder.getOrCreate() # 配置JDBC参数 jdbc_url = "jdbc:teradata://<IP_ADDRESS>/DATABASE=<DB_NAME>,TMODE=ANSI,CHARSET=UTF8,LOGMECH=LDAP" user = "你的用户名" password = "你的密码" driver = "com.teradata.jdbc.TeraDriver" # 获取JDBC连接并执行删除操作 with spark._sc._gateway.jvm.java.sql.DriverManager.getConnection(jdbc_url, user, password) as conn: with conn.createStatement() as stmt: drop_sql = "DROP TABLE <DB_NAME>.<TABLENAME>" stmt.execute(drop_sql)
额外注意点
- 原URL中的
DATABASE=. <DB_NAME>是错误的,应该改成DATABASE=<DB_NAME>,去掉多余的点和空格 - 不要给DDL语句加冗余括号,Teradata不支持这种写法
内容的提问来源于stack exchange,提问作者rbigley
相关产品推荐
相关产品推荐

