Отличие от первого значения в опоре Spark Sql - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующие данные:

val df = Seq(("Central" , "Copy Paper" , "Benjamin Ross" , "$15.58" , "$3.91" , "126"),
     |       ("East" , "Copy Paper" , "Catherine Rose" , "$12.21" , "$0.08"  ,"412"),
     |       ("West" ,"Copy Paper" , "Patrick O'Brill" , "$2,756.66" , "$1,629.98" ,"490"),
     |       ("Central" , "Business Envelopes" , "John Britto" , "$212.74" , "$109.66" , "745"),
     |       ("East" , "Business Envelopes" , "xyz" , "$621" , "$721" ,"812")).toDF("Region" , "Product" , "Customer" , "Sales",  "Cost" , "Autonumber")

df.show ()

+-------+------------------+---------------+---------+---------+----------+
| Region|           Product|       Customer|    Sales|     Cost|Autonumber|
+-------+------------------+---------------+---------+---------+----------+
|Central|        Copy Paper|  Benjamin Ross|   $15.58|    $3.91|       126|
|   East|        Copy Paper| Catherine Rose|   $12.21|    $0.08|       412|
|   West|        Copy Paper|Patrick O'Brill|$2,756.66|$1,629.98|       490|
|Central|Business Envelopes|    John Britto|  $212.74|  $109.66|       745|
|   East|Business Envelopes|            xyz|     $621|     $721|       812|
+-------+------------------+---------------+---------+---------+----------+

Вы можете видеть, что для продукта Business Envelopes нет данных относительно Запада. Если бы были данные для Запада, результат не был бы нулевым. Поскольку нет данных, которые поворачиваются с областью, в результате были получены нулевые значения, которые должны быть равны 0, поэтому их можно вычесть из первого (sum (Autonumber)) и получить значение. Вместо этого теперь он возвращает ноль. Если каким-то образом я могу получить данные для Central в группе по запросу, все будет намного проще.

Я попробовал следующий запрос:

spark.sql("SELECT * FROM (SELECT region r, product as p, SUM(Autonumber) - first(sum(Autonumber)) over ( partition by product order by product , region) as new  from test1 group by r , p order by p,r) test1 pivot (sum(new) for r in ('Central' Central , 'East' East, 'West' West))").show

Это были данные, которые я получил

+------------------+-------+-----+-----+
|                 p|Central| East| West|
+------------------+-------+-----+-----+
|Business Envelopes|    0.0| 67.0| null|
|        Copy Paper|    0.0|286.0|364.0|
+------------------+-------+-----+-----+

Там, где я ожидал, что будет так ..

+------------------+-------+-----+------+
|                 p|Central| East|  West|
+------------------+-------+-----+------+
|Business Envelopes|       | 67.0|-745.0|
|        Copy Paper|       |286.0| 364.0|
+------------------+-------+-----+------+

Это не что иное, как поворот на области с суммой (autonumber) и затем вычитание из первого значения.

Любые предложения о том, что можно сделать, чтобы получить -745 вместо нуля?

1 Ответ

0 голосов
/ 14 апреля 2020

Полагаю, это невозможно. Вместо этого я повернул набор данных, а затем вычел из первого значения.

spark.sql("select p , coalesce(Central , 0) - null as Central , coalesce(East,0) - coalesce(central,0) as East , coalesce(West , 0) - coalesce(central,0) as West from (SELECT * FROM (SELECT region r, product as p, SUM(Autonumber) as new  from test group by r , p order by p) test pivot (sum(new) for r in ('Central' Central ,'East' East, 'West' West)))").show
...