org.apache.spark.sql.AnalysisException:无法解析“S.SID”

Posted

技术标签:

【中文标题】org.apache.spark.sql.AnalysisException:无法解析“S.SID”【英文标题】:org.apache.spark.sql.AnalysisException: cannot resolve '`S.SID`' 【发布时间】:2018-09-07 05:49:10 【问题描述】:

我正在使用 Java 语言。我的代码中有以下查询:

public static String GET_E_BCHGS = "SELECT BCL.* "
+"FROM (SELECT * " 
      +"FROM (SELECT (SELECT BILLABLE_CHG_ID " 
                    +"FROM BC " 
                    +"WHERE BC.BILLABLE_CHG_STAT = 10 "
                    +"AND BC.FEED_SOURCE_FLG = 'TFM' " 
                    +" AND BC.SA_ID = S.SA_ID AND (EXISTS (SELECT 1 " 
                                                        +"FROM BCC " 
                                                        +"WHERE BCC.BILLABLE_CHG_ID = BC.BILLABLE_CHG_ID " 
                                                        +"AND BCC.CHAR_TYPE_CD = 'AGG_CRTA' " 
                                                        +"AND BCC.ADHOC_CHAR_VAL = S.SID) " 
                                                        +"OR "
                                                        +"(BC.PRICEITEM_CD = S.FIN_PRICEITEM_CD " 
                                                        +"AND BC.TOU_CD =S.TOU_CD " 
                                                        +"AND BC.START_DT =S.BCHG_START_DT " 
                                                        +"AND BC.END_DT =S.BCHG_END_DT " 
                                                        +"AND BC.PRICE_ASGN_ID= S.PRICE_ASGN_ID " 
                                                        +"AND BC.PRICEITEM_PARM_GRP_ID = S.PRICEITEM_PARM_GRP_ID " 
                                                        +"AND BC.AGG_PARM_GRP_ID = S.AGG_PARM_GRP_ID) "
                                                +") AND NOT EXISTS (SELECT 1 " 
                                                                  +"FROM C, BS " 
                                                                  +"WHERE BS.bseg_id = C.bseg_id " 
                                                                  +"AND C.billable_chg_id = BC.BILLABLE_CHG_ID " 
                                                                  +"AND BS.bseg_stat_flg not in (10,60))) " 
              +"AS BILLABLE_CHG_ID " 
              +"FROM S " 
              +"WHERE SID >= '2100000000063000004222017020100018243020717805750011' " 
             +"AND SID <= null " 
             +"AND " 
              +"STATUS = ' ' " 
              +"AND TXN_RATING_CRITERIA ='RITA') " 
        +"WHERE BILLABLE_CHG_ID <> ' ' " 
        +"GROUP BY BILLABLE_CHG_ID) F, BCL " 
+"WHERE F.BILLABLE_CHG_ID = BCL.BILLABLE_CHG_ID " 
+"ORDER BY BCL.BILLABLE_CHG_ID, LINE_SEQ";

我正在尝试在 Spark SQL 中使用相同的代码,下面是相同的代码:

Dataset<Row> bc = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "B_CHG").load();
    bc.createOrReplaceTempView("BC");
    Dataset<Row> bcc = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "B_CHG_CHAR").load();
    bcc.createOrReplaceTempView("BCC");
    Dataset<Row> c = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "B_CALC").load();
    c.createOrReplaceTempView("C");
    Dataset<Row> bs = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "BSEG").load();
    bs.createOrReplaceTempView("BS");
    Dataset<Row> s = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "TXN_DTL_P_SUMMARY").load();
    s.createOrReplaceTempView("S");
    Dataset<Row> bcl = sparkSession.read().format("jdbc").option("url",connection ).option("dbtable", "B_CHG_L").load();
    bcl.createOrReplaceTempView("BCL");
    
    Dataset<Row> existingBchgsDS = sparkSession.sql(SQQueries.GET_E_BCHGS);
    existingBchgsDS.show();

在运行此代码时,我遇到了下面提到的错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`S.SID`' given input columns: [bcc.CHAR_VAL_FK4, bcc.CHAR_VAL_FK2, bcc.CHAR_VAL_FK5, bcc.BILLABLE_CHG_ID, bcc.ADHOC_CHAR_VAL, bcc.CHAR_VAL_FK3, bcc.CHAR_TYPE_CD, bcc.SRCH_CHAR_VAL, bcc.CHAR_VAL_FK1, bcc.CHAR_VAL, bcc.VERSION, bcc.EFFDT]; line 1 pos 297;
'Sort ['BCL.BILLABLE_CHG_ID ASC NULLS FIRST, 'LINE_SEQ ASC NULLS FIRST], true.........

//more lines of error

我想了解:

    这个查询有什么问题?相同的查询在 sql developer 上运行正常。

    Spark SQL 是否支持此类查询?

    还有其他写法吗?

Spark 版本:2.3.0

【问题讨论】:

Spark SQL 仅支持 ANSI SQL (SQL-92?) 和 HiveQL。 @philantrovert 好的,那么有什么方法可以使用 spark sql 运行上述查询吗?我正在使用 oracle 数据库。 为什么不通过 JDBC 执行整个查询,而不是在 Spark 中缓存临时表? @philantrovert 所以你建议在火花中使用 JDBC 吗?因为我的理解是它会降低性能。通过使用 JDBC,我们不会从 spark 功能中获得任何好处……这是真的吗? 这取决于您的表格的结构。您可以指定各种 JDBC 属性来提高性能,但一般而言,通过 jDBC 进行的查询的性能将低于通过 Spark 在 Hive 上的查询。 【参考方案1】:

    我认为你所做的是正确的,你可以写 sparkSession.sql() 作为错误状态,我认为在应用所有其他条件后,它无法找出 Dataset S 中的 column SID,我认为它更好以便我们了解您是否也可以发布数据集的架构。

    是的,支持,但我建议在数据集上使用过滤器和选择等,以便您可以更好地控制代码。 主要变化是易于编码和调试。使用 spark.sql,您在编译时不会有任何关于错误或类型错误的信息......并且使用 .filter、.select 更容易缩进、阅读等......并且它具有相同的性能。

【讨论】:

我曾尝试使用 filter 和 select 编写此查询,但它变得非常复杂。您能给我举个例子,如何使用 select 和 filter 编写如此复杂的查询吗? 同样查询在 sql developer 上运行正常,那么这里的问题是什么? 所以你复制了我回答的确切内容,但仍然不接受它......这是非常不幸的行为:'(祝你有美好的一天@Sundeep Pidugu Mouahahha

以上是关于org.apache.spark.sql.AnalysisException:无法解析“S.SID”的主要内容,如果未能解决你的问题,请参考以下文章