Spark SQL执行失败。获取java.lang.RuntimeException:[1.227]失败:``union''期待但是`。'发现

时间:2016-08-02 07:30:49

标签: apache-spark dataframe pyspark apache-spark-sql

我正在运行Spark 1.6版本,我正在尝试使用spark进行远程数据处理。使用JDBC从远程数据库获取数据后,我创建了spark数据框,并使用registerTempTable('')方法临时保存为表。到目前为止,它正在发挥作用。当我在spark上下文中运行查询时,我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ubuntu/spark-1.6.2-bin-hadoop2.6/python/pyspark/sql/context.py", line 580, in sql
    return DataFrame(self._ssql_ctx.sql(sqlQuery), self)
  File "/home/ubuntu/spark-1.6.2-bin-hadoop2.6/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__
  File "/home/ubuntu/spark-1.6.2-bin-hadoop2.6/python/pyspark/sql/utils.py", line 45, in deco
    return f(*a, **kw)
  File "/home/ubuntu/spark-1.6.2-bin-hadoop2.6/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o21.sql.
: java.lang.RuntimeException: [1.227] failure: ``union'' expected but `.' found

我在命令提示符下使用pyspark,这是我的代码:

from pyspark import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.read.format('jdbc').options( 
    url='jdbc:sqlserver://<ipaddress>;user=xyz;password=pw',
    dbtable='JOURNAL'
).load()
df.registerTempTable('JOURNAL')

df = sqlContext.read.format('jdbc').options(
    url='jdbc:sqlserver:<ipaddress>;user=xyz;password=pw',
    dbtable='GHIS'
).load()
df.registerTempTable('GHIS')

df = sqlContext.read.format('jdbc').options(
    url='jdbc:sqlserver:<ip address>;user=xyz;password=pw',
    dbtable='LEAS'
).load()
df.registerTempTable('LEAS')

到目前为止,我正在收集并加载数据

现在,我遇到了问题:

doubtaccount = sqlContext.sql("SELECT  ENTITYID as EntityID,SUBSTRING(DESCRPN,1,CHARINDEX('-',DESCRPN,1)-1) as BldgID,SUBSTRING(DESCRPN,CHARINDEX('-',DESCRPN,1)+1,20) as LeaseID,PERIOD*100+15 as TxnDateInt,PERIOD as Period,0-AMT as BDAmt FROM BI_Staging.dbo.JOURNAL where SOURCE = 'DA' and ACCTNUM = 'RE078201000' and STATUS = 'P' ")

当我运行此查询时,我遇到了上述问题。我在堆栈溢出中搜索了类似的错误,但我没有找到任何错误。我的查询有什么问题吗?这实际上在数据库中有效。

1 个答案:

答案 0 :(得分:1)

被修改

当您执行df.registerTempTable('JOURNAL')时,您使数据框可用于名为JOURNAL的sqlContext,因此您的查询必须使用此名称访问它:

doubtaccount = sqlContext.sql("SELECT  ... FROM JOURNAL where ... ")

但请注意,此查询将由spark解析,而不是由数据库解析,因此语法必须与hive兼容。

如果您希望在数据库中执行查询,在将数据加载到spark之前,您可以在dbtable选项中执行此操作:

query = "(SELECT ... FROM BI_Staging.dbo.JOURNAL where ...) AS JOURNAL"

df = sqlContext.read.format('jdbc').options(
    url = 'jdbc:sqlserver://<ipaddress>;user=xyz;password=pw',   
    dbtable = query
).load()

df.registerTempTable('JOURNAL')