Pyspark 在查询结束时需要foo

Pyspark 在查询结束时需要foo,pyspark,teradata,Pyspark,Teradata,为什么需要在查询的末尾加上foo这个词 queryTwo = """(SELECT max(lst_updt_dt_tm) as maxDt FROM table) foo """ theTable = sqlContext.read.format("jdbc").options(url="the url", driver = "the td driver", dbtable = queryTwo, user="xxxx", password="xxxx").load() theTable.s

为什么需要在查询的末尾加上foo这个词

queryTwo = """(SELECT max(lst_updt_dt_tm) as maxDt FROM table) foo """

theTable = sqlContext.read.format("jdbc").options(url="the url", driver = "the td driver", dbtable = queryTwo, user="xxxx", password="xxxx").load()
theTable.show();

如果我删除“foo”一词,代码将失败。

从您的注释中的错误中反向工程这里发生了什么:

java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.33] [Error 3707] [SQLState 42000] Syntax error, expected something like a name or a Unicode delimited identifier or an 'UDFCALLNAME' keyword or '(' between the 'FROM' keyword and the 'SELECT' keyword.
很明显,
dbtable
参数需要一个子查询作为输入。sqlContext.read.format(“jdbc”)中发生的任何情况。选项将把查询重写为:

 SELECT <something> FROM <dbtable> <possibly something more here>;
从中选择;
因此,它要求
dbtable
是一个子查询,这就是为什么必须将其括在括号中并为其指定别名
foo

如果您仔细阅读本文档,您将看到:

dbtable:应该读取的JDBC表。请注意,任何 可以使用SQL查询的FROM子句中的valid。例如 您也可以使用括号中的子查询来代替完整表


因此,您可以给它一个表,或者,可选地,您可以给它一个子查询。由于它没有指定子查询别名必须是
foo
,因此您可以在此处编写任何合法的别名,如
mysubquery
“如果您愿意,这对于子查询别名“
“f”
来说是一个糟糕的选择。”

queryTwo=“”从DDWV21.SRVY”“中选择max(lst_updt_dt_tm)作为maxDt”表格=sqlContext.read.format(“jdbc”)。选项(url=“jdbc:teradata://teradata-dns-sysa.fg.rbc.com,driver=“com.teradata.jdbc.TeraDriver”,dbtable=queryTwo,user=“xxx”,password=“xxx”).load()表格.show();此处的错误消息是:java.sql.SQLException:[Teradata数据库][TeraJDBC 15.10.00.33][error 3707][SQLState 42000]语法错误,应为名称或Unicode分隔标识符或'UDFCALLNAME'关键字或'('介于'FROM'关键字和'SELECT'关键字之间。可能是因为子查询必须有别名。请在不带括号的情况下尝试。