У меня есть представление о Hive, созданное с помощью CTE (предложение WITH), которое объединяет две таблицы, а затем вычисляет, чтобы показать только самую последнюю запись для каждого идентификатора.
В моем env у меня есть инструмент для просмотра баз данных кустов (DBeaver, обязательный для dev данных, не имеющих данных, для просмотра данных).
Посмотреть код
CREATE VIEW IF NOT EXISTS db.test_cte_view AS
with cte as (select * from db.test_cte union select * from db.test_cte_2),
tmp as (SELECT id, idate, ROW_NUMBER() over(PARTITION BY id ORDER BY idate desc ) AS row_num from cte)
SELECT cte.* from cte
join (SELECT * from tmp where tmp.row_num =1) tmp_2
on cte.id = tmp_2.id
and cte.idate = tmp_2.idate
Вопрос:
когда вид создается через билайн
(который является нашим основным способом создания таблиц и представлений в Hive)
Я легко могу просматривать DBeaver, но при запуске процесса чтения из него происходит сбой со следующим:
##pyspark
spark.sql("select * from db.test_cte_view").show()
'Table or view not found: cte; line 3 pos 56'
Traceback (most recent call last):
File "DATA/fs3/hadoop/yarn/local/usercache/ingouagn/appcache/application_1552132357519_15102/container_e378_1552132357519_15102_01_000001/pyspark.zip/pyspark/sql/session.py", line 545, in sql
return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
File "/DATA/fs3/hadoop/yarn/local/usercache/ingouagn/appcache/application_1552132357519_15102/container_e378_1552132357519_15102_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
answer, self.gateway_client, self.target_id, self.name)
File "/DATA/fs3/hadoop/yarn/local/usercache/ingouagn/appcache/application_1552132357519_15102/container_e378_1552132357519_15102_01_000001/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: 'Table or view not found: cte; line 3 pos 56'
Когда представление создается с помощью sparl.sql ("CREATE VIEW AS ...")
Я могу хорошо прочитать с
##pyspark
spark.sql("select * from db.test_cte_view").show()
Но при попытке просмотра с помощью DBeaver происходит сбой, например:
Query execution failed
Reason:
SQL Error [40000] [42000]: Error while compiling statement: FAILED: SemanticException line 1:330 Failed to recognize predicate 'UNION'. Failed rule: 'identifier' in subquery source in definition of VIEW test_cte_view [
SELECT `gen_attr_0` AS `id`, `gen_attr_1` AS `status`, `gen_attr_2` AS `idate` FROM (SELECT `gen_attr_0`, `gen_attr_1`, `gen_attr_2` FROM ((SELECT `gen_attr_0`, `gen_attr_1`, `gen_attr_2` FROM (SELECT `id` AS `gen_attr_0`, `status` AS `gen_attr_1`, `idate` AS `gen_attr_2` FROM `db`.`test_cte`) AS gen_subquery_0) UNION DISTINCT (SELECT `gen_attr_5`, `gen_attr_6`, `gen_attr_7` FROM (SELECT `id` AS `gen_attr_5`, `status` AS `gen_attr_6`, `idate` AS `gen_attr_7` FROM `db`.`test_cte_2`) AS gen_subquery_1)) AS cte INNER JOIN (SELECT `gen_attr_3`, `gen_attr_4`, `gen_attr_8` FROM (SELECT `gen_attr_3`, `gen_attr_4`, `gen_attr_8` FROM (SELECT gen_subquery_4.`gen_attr_3`, gen_subquery_4.`gen_attr_4`, row_number() OVER (PARTITION BY `gen_attr_3` ORDER BY `gen_attr_4` DESC NULLS LAST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `gen_attr_8` FROM (SELECT `gen_attr_3`, `gen_attr_4` FROM ((SELECT `gen_attr_3`, `gen_attr_9`, `gen_attr_4` FROM (SELECT `id` AS `gen_attr_3`, `status` AS `gen_attr_9`, `idate` AS `gen_attr_4` FROM `db`.`test_cte`) AS gen_subquery_2) UNION DISTINCT (SELECT `gen_attr_5`, `gen_attr_6`, `gen_attr_7` FROM (SELECT `id` AS `gen_attr_5`, `status` AS `gen_attr_6`, `idate` AS `gen_attr_7` FROM `db`.`test_cte_2`) AS gen_subquery_3)) AS cte) AS gen_subquery_4) AS gen_subquery_5) AS tmp WHERE (`gen_attr_8` = 1)) AS tmp_2 ON ((`gen_attr_0` = `gen_attr_3`) AND (`gen_attr_2` = `gen_attr_4`))) AS cte
] used as test_cte_view at Line 1:14
Кажется, сгенерированный код отличается от одного способа создания представления к другому.
Есть ли способ заставить работать первый сценарий (создание представления через beeline и доступ к нему через spark sql)?
Спасибо.
Искра: 2.1.1 , Улей: 1.2.1
Таблица
CREATE TABLE db.test_cte(
id int,
status string,
idate date )
CREATE TABLE db.test_cte_2(
id int,
status string,
idate date )
заполнено:
insert into db.test_cte values
(1,"green","2019-03-08"),
(2,"green","2019-03-08"),
(3,"green","2019-03-08"),
(1,"red","2019-03-09"),
(1,"yellow","2019-03-10"),
(2,"gray","2019-03-09")
insert into db.test_cte_2 values
(10,"green","2019-03-08"),
(20,"green","2019-03-08"),
(30,"green","2019-03-08"),
(10,"red","2019-03-09"),
(10,"yellow","2019-03-10"),
(20,"gray","2019-03-09")
Редактировать
Для всех, кто заинтересовался, я создал проблему на Spark JIRA:
https://issues.apache.org/jira/browse/SPARK-27203