我可以从teradata数据库中选择,但不能放弃使用pyspark。
我还使用了jaydebeapi在同一个spark会话中删除表,这很有效。希望有人能遇到同样的问题。
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]语法错误,应为名称、Unicode分隔的标识符、“UDFCALLNAME”关键字、“SELECT”关键字或“(”,介于“(”和“DROP”关键字之间。
1条答案
按热度按时间h5qlskok1#
spark.read
提供了更高级的语言。它不是Python的Terradata驱动程序。spark.read.format('jdbc').option(query, '...')
的查询只能包含SELECT
语句。SELECT
中。例如:将转换为在底层DB上并行执行的3个查询。请注意真实的的会略有不同,这是出于学术目的而策划的:
因此,在您的情况下,Terradata不高兴,因为Spark正在执行以下内容:
SELECT t.* FROM (DROP TABLE <DB_NAME>.<TABLENAME>) t
你拥有的不是“pyspark jdbc连接器到teradata”。Terradata JDBC驱动程序
要在Terradata上运行Terradata specific SQL,您需要编写使用Terradata特定驱动程序的Python代码。这里有一个例子。
如果你想在Databricks/Spark-cluster上运行这段代码,那么你必须在有问题的集群上执行add the jdbc driver library。例如,作为集群库。然后在该集群上运行上面的代码。
我假设您已经这样做了,因为您得到的错误。