Различная сумма и группировка по - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть набор данных [прикрепленный пример], и я хочу создать 2 таблицы из этого;

+------+------------+-------+-------+-------+--------+
| corp |  product   | data  | Group | sales | market |
+------+------------+-------+-------+-------+--------+
| A    | Eli        | 43831 | A     |   100 | I      |
| A    | Eli        | 43831 | B     |   100 | I      |
| B    | Sut        | 43831 | A     |    80 | I      |
| A    | Api        | 43831 | C     |    50 | C or D |
| A    | Api        | 43831 | D     |    50 | C or D |
| B    | Konkurent2 | 43831 | C     |    40 | C or D |
+------+------------+-------+-------+-------+--------+

1-я - сумма (продажи) по рынку и исключить дублированные строки, поэтому я хочу закончить с продажами для каждого рынка в указанной c дате гнева (столбец данных), но исключая дублированные - у меня они есть, потому что 1 продукт может быть в более чем 1 группе

Итак, первая таблица, например, для MR CC Я бы выглядел следующим образом:

+--------+-------+-------+
| market | sales | data  |
+--------+-------+-------+
|  I     |   180 | 43831 |
+--------+-------+-------+

Тогда вторую таблицу я бы хотел выглядел выше, но добавить в качестве «словаря» дополнительный столбец с уникальным названием продукта в Market и Date, то есть для MR CC Я бы выглядел так:

+--------+-------+-------+----------------+
| market | sales | data  | unique product |
+--------+-------+-------+----------------+
| I      |   180 | 43831 | eli            |
| I      |   180 | 43831 | Sut            |
+--------+-------+-------+----------------+

Дело в том, что я не настолько опытен в SQL, и я довольно новичок в DataProcessing, система, в которой я работаю, позволяет мне делать некоторые обработки данных с помощью «визуальных» рецептов или кода SQL, с которым я не очень знаком. И даже меня смущает, что я могу выбрать между 3 SQL СУБД, Impala, Hive, Spark SQL - например, для создания рыночной колонки я использовал Impala, и скрипт выглядит так, и я не уверен, что это «чистая» Impala синтаксис:

SELECT * from
(  
   -- mrc I --
    SELECT *,case when 
    (`product`="Eli") 
    or
    (`product`="Sut")  
    THEN  "MRCC I"
    end as market
    FROM x.`y`  
  )a
where market is not null

Не могли бы вы дать мне несколько советов о структуре кода и, если это вообще возможно?

Спасибо, eM

1 Ответ

1 голос
/ 21 апреля 2020
  import spark.implicits._
  import org.apache.spark.sql.functions._

  case class Sale(
                 corp:    String,
                 product: String,
                 data:    Long,
                 group:   String,
                 sales:   Long,
                 market:  String
                 )

  val df = Seq(
    Sale("A", "Eli", 43831, "A", 100, "I"),
    Sale("A", "Eli", 43831, "B", 100, "I"),
    Sale("A", "Sut", 43831, "A", 80, "I"),
    Sale("A", "Api", 43831, "C", 50, "C or D"),
    Sale("A", "Api", 43831, "D", 50, "C or D"),
    Sale("B", "Konkurent2", 43831, "C", 40, "C or D")
  ).toDF()

  val t2 = df.dropDuplicates(Seq("corp", "product", "data", "market"))
    .groupBy("market", "product", "data").sum("sales")
    .select(
      'market,
      col("sum(sales)").alias("sales"),
      'data,
      'product.alias("unique product")
    )

  t2.show(false)
//  +------+-----+-----+--------------+
//  |market|sales|data |unique product|
//  +------+-----+-----+--------------+
//  |I     |80   |43831|Sut           |
//  |I     |100  |43831|Eli           |
//  |C or D|40   |43831|Konkurent2    |
//  |C or D|50   |43831|Api           |
//  +------+-----+-----+--------------+

  val t1 = t2.drop("unique product")
    .groupBy("market", "data").sum("sales")
    .select(
      'market,
      col("sum(sales)").alias("sales"),
      'data)

  t1.show(false)
//  +------+-----+-----+
//  |market|sales|data |
//  +------+-----+-----+
//  |I     |180  |43831|
//  |C or D|90   |43831|
//  +------+-----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...