【发布时间】:2016-04-25 08:22:38
【问题描述】:
在 Teradata 中查询易失性表时使用 Spark 1.5.1 时出现以下错误:
Exception in thread "main" java.sql.SQLException: [Teradata Database] [TeraJDBC 15.00.00.20] [Error 3707] [SQLState 42000] Syntax error, expected something like a name or a Unicode delimited identifier or '(' between the 'FROM' keyword and the 'CREATE' keyword.
这是我正在运行的生成上述错误的代码:
val url = "jdbc:teradata://FOO/, TMODE=TERA,TYPE=DEFAULT"
val properties = new java.util.Properties()
val driver = "com.teradata.jdbc.TeraDriver"
properties.setProperty("driver",driver)
properties.setProperty("username","USER")
properties.setProperty("password","PASSWORD")
var query =
f"""
CREATE VOLATILE MULTISET TABLE tmp AS
( SELECT * FROM database.table )
WITH DATA PRIMARY INDEX(CR_PLCY_ID) ON COMMIT PRESERVE ROWS;
COMMIT;
SELECT * FROM tmp;
"""
var df = sqlContext.read.jdbc(url,query,properties)
旁注:我过度简化了原始查询,以测试通过 JDBC 查询的易失性表的功能。原始查询有多个易失性表。
任何帮助或建议将不胜感激。
【问题讨论】:
-
我不知道到底发生了什么,但您不能使用
FASTEXPORT连接来创建易失性表。顺便说一句,您请求SESSIONS=10和一个 VT 是 session-local。 -
谢谢!我将从 FASTEXPORT 更改,看看我是否可以创建易失性表。
-
当我将“TYPE=FASTEXPORT”更改为“TYPE=DEFAULT”并删除线程“main”java.sql.SQLException 中的“SESSIONS=10”异常时收到以下错误:[Teradata Database ] [TeraJDBC 15.00.00.20] [错误 3707] [SQLState 42000] 语法错误,应为名称或 Unicode 分隔标识符或“FROM”关键字和“CREATE”关键字之间的“(”。
-
是同样的错误信息?我不能再帮你了,因为我不了解 Spark。它似乎只是将您的查询包装成其他东西,看起来像
SELECT * FROM your_query。如果您有权访问 QueryLog,您可能会在 bc.QryLogV(或 QryLogSQL)中找到实际提交给 Teradata 的源。还有一个问题:你把 CREATE 和 SELECT 作为一个单独的请求提交,这是不允许的,CREATE 必须提交。 -
除非您对上面的代码进行了过度简化,否则不需要 volatile 表。只需运行
SELECT * FROM {database}.{table};即可为您用于为 volatile 表播种的 FastExport。
标签: scala jdbc apache-spark teradata