org.apache.spark.sql.AnalysisException: не удается разрешить `` S.SID ''

Я использую язык 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

Я хочу понять :

  1. что не так с этим запросом? Тот же запрос правильно работает на sql-разработчике.

  2. Поддерживаются ли такие запросы в Spark SQL?

    or

  3. есть ли другой способ написать то же самое?

Версия Spark: 2.3.0


person Raj    schedule 07.09.2018    source источник
comment
Spark SQL поддерживает только ANSI SQL (SQL-92?) И HiveQL.   -  person philantrovert    schedule 07.09.2018
comment
@philantrovert хорошо, есть ли способ запустить вышеуказанный запрос с помощью Spark sql? Я использую Oracle DB.   -  person Raj    schedule 07.09.2018
comment
Почему бы вам не выполнить весь запрос через JDBC вместо кеширования временных таблиц в Spark?   -  person philantrovert    schedule 07.09.2018
comment
@philantrovert, так вы предлагаете использовать JDBC в искре? потому что, как я понимаю, это снизит производительность. используя JDBC, мы не получим никакой выгоды от функциональности искры ... это правда?   -  person Raj    schedule 07.09.2018
comment
Это зависит от того, как устроена ваша таблица. Вы можете указать различные свойства JDBC для повышения производительности, но в целом запросы через jDBC будут менее производительными, чем запросы через Hive через Spark.   -  person philantrovert    schedule 07.09.2018
comment
@philantrovert да, на самом деле я пытаюсь преобразовать существующий пакетный код в java с внутренней структурой оракула в Java-код в среде Spark, теперь в существующем коде используется JDBC, и если я использую то же самое здесь, тогда нет преимущества искры? так что кроме JDBC других альтернатив нет? я имею в виду без использования Hive.   -  person Raj    schedule 07.09.2018
comment
Проблема решена? @Raj Я также сталкиваюсь с аналогичной проблемой, когда записываю свои потоковые данные в таблицу куста (вставьте в работу)   -  person BigD    schedule 29.12.2018
comment
@BigD да, но моя проблема была связана с форматом SQL-запроса, поэтому я изменил формат, и он сработал.   -  person Raj    schedule 03.01.2019


Ответы (1)


  1. Я думаю, что то, что вы делаете, правильно, вы можете написать sparkSession.sql(), поскольку в сообщении об ошибке я думаю, что он не может определить column SID в Dataset S после применения всех других условий, я думаю, что нам лучше понять, можете ли вы опубликовать схему Наборы данных тоже.

  2. Да, они поддерживаются, но я рекомендую использовать фильтр, выбор и другие параметры в наборе данных, чтобы вы могли лучше контролировать код. Главное изменение - простота кодирования и отладки. С spark.sql у вас не будет никакой информации во время компиляции об ошибках или типовых ошибках ... А с помощью .filter, .select намного проще отступать, читать и т. Д. ... и он имеет такую ​​же производительность.

person Community    schedule 07.09.2018
comment
Я попытался написать этот запрос с помощью фильтра и выбора, но он становится очень сложным. Не могли бы вы привести мне пример того, как писать такие сложные запросы с помощью выбора и фильтрации? - person Raj; 07.09.2018
comment
Также запрос работает правильно на sql-разработчике, тогда в чем проблема? - person Raj; 07.09.2018
comment
Итак, вы скопировали точные слова моего ответа, но все равно не приняли его ... это довольно неудачное поведение прямо здесь: '(Хорошего дня @Sundeep Pidugu Mouahahha - person tricky; 12.09.2018