Как получить доступ к столбцу из подзапроса во внешнем запросе, используя Spark SQL - PullRequest
0 голосов
/ 08 декабря 2018

В Spark SQL я выполнил запрос

select 
  Retailer_country,
  max(sold) 
from (
  select 
    Retailer_country,
    count(*) as sold 
  from ProductInfo 
  where year=2013 and Product_type='Watches' 
  group by Retailer_country
)

к набору данных, имеющему столбцы

Retailer_country
Order_method_type
Retailer_type
Product_line
Product_type
Product
Year
Quarter
Revenue
Quantity
Gross_margin

Возвращает исключение

 org.apache.spark.sql.AnalysisException: grouping expressions sequence is empty, and '__auto_generated_subquery_name.`Retailer_country`' is not an aggregate function. Wrap '(max(__auto_generated_subquery_name.`solds`) AS `max(solds)`)' in windowing function(s) or wrap '__auto_generated_subquery_name.`Retailer_country`' in first() (or first_value) if you don't care which value you get.;;
 Aggregate [Retailer_country#10, max(solds#77L) AS max(solds)#80L]
+- SubqueryAlias `__auto_generated_subquery_name`
+- Aggregate [Retailer_country#10], [Retailer_country#10, count(1) AS solds#77L]
  +- Filter ((cast(year#16 as int) = 2013) && (Product_type#14 = Watches))
     +- SubqueryAlias `productinfo`
        +- Relation[Retailer_country#10,Order_method_type#11,Retailer_type#12,Product_line#13,Product_type#14,Product#15,Year#16,Quarter#17,Revenue#18,Quantity#19,Gross_margin#20] csv

Во время выполнениятот же запрос в онлайн-компиляторе с той же структурой таблицы, он возвращает

USA|4.

Образец данных:

USA|Fax|Outdoors Shop|Camping Equipment|Cooking Gear|TrailChef Deluxe Cook Set|2012|Q1 2012|59628.66|489|0.34754797
USA|Fax|Outdoors Shop|Camping Equipment|Cooking Gear|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
USA|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
USA|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
USA|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
UK|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
UK|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
USA|Fax|Outdoors Shop|Camping Equipment|watch|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
UK|Fax|Outdoors Shop|Camping Equipment|Cooking Gear|TrailChef Deluxe Cook Set|2013|Q1 2012|59628.66|489|0.34754797
UK|Fax|Outdoors Shop|Camping Equipment|Cooking Gear|TrailChef Deluxe Cook Set|2012|Q1 2012|59628.66|489|0.34754797

Чем отличается результат и какотобразить Retailer_country в искре.Любая помощь, чтобы решить это.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Разве вы не можете просто 'заказать по проданным товарам' в приведенном выше запросе Simonare и ограничить ваши записи 1?

select 
  Retailer_country,
  count(*) as sold 
from ProductInfo 
where year=2013 and Product_type='Watches' 
group by Retailer_country
order by sold desc
limit 1
0 голосов
/ 08 декабря 2018

у вас есть два агрегата.один для подзапроса другой для основного запроса.формат вашего запроса должен быть таким, как показано ниже

select 
  Retailer_country,
  max(sold) 
from (
  select 
    Retailer_country,
    count(*) as sold 
  from ProductInfo 
  where year=2013 and Product_type='Watches' 
  group by Retailer_country)
group by Retailer_country

, однако, если мы углубимся в ваш запрос, ваш подзапрос выдаст различный Retailer_country из-за группировки по совокупности.следовательно, вам не нужно использовать внешний максимальный (проданный) агрегат.В результате ваш последний запрос на самом деле будет таким:

select 
  Retailer_country,
  count(*) as sold 
from ProductInfo 
where year=2013 and Product_type='Watches' 
Group by Retailer_country

Редактировать: в соответствии с предоставленным комментарием

select 
  Retailer_country,
  count(*) as sold 
from ProductInfo 
where year=2013 and Product_type='Watches' 
group by Retailer_country
Order by sold desc
limit 1
...