Как заполнить все возможные комбинации значений в столбцах, используя Spark / normal SQL - PullRequest
0 голосов
/ 06 мая 2020

У меня есть сценарий, в котором мой исходный набор данных выглядит так, как показано ниже

Данные:

Country,Commodity,Year,Type,Amount
US,Vegetable,2010,Harvested,2.44
US,Vegetable,2010,Yield,15.8
US,Vegetable,2010,Production,6.48
US,Vegetable,2011,Harvested,6
US,Vegetable,2011,Yield,18
US,Vegetable,2011,Production,3
Argentina,Vegetable,2010,Harvested,15.2
Argentina,Vegetable,2010,Yield,40.5
Argentina,Vegetable,2010,Production,2.66
Argentina,Vegetable,2011,Harvested,15.2
Argentina,Vegetable,2011,Yield,40.5
Argentina,Vegetable,2011,Production,2.66
Bhutan,Vegetable,2010,Harvested,7
Bhutan,Vegetable,2010,Yield,35
Bhutan,Vegetable,2010,Production,5
Bhutan,Vegetable,2011,Harvested,2
Bhutan,Vegetable,2011,Yield,6
Bhutan,Vegetable,2011,Production,3

Изображение из приведенного выше csv:

Sample source data

Теперь есть очень маленькая справочная таблица по странам, в которой перечислены все возможные страны, по которым могут поступать исходные данные. PFB:

Country lookup table

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

Итак, мне нужно каким-то образом объединить исходные данные с country_lookup csv и заполните все эти столбцы значением по умолчанию как F. Каждый столбец страны будет двоичным с возможными значениями T или F.

Исходный набор данных из приведенного выше должен быть преобразован в следующий:

Данные (я оставил поле Amount неразрешенным для типа столбца, имеющего Derived Yield как есть, вместо того, чтобы вычислять их ниже для лучшего понимания и для соответствия формулам):

Country,Commodity,Year,Type,Amount,US,Argentina,Bhutan,India,Nepal,Bangladesh
US,Vegetable,2010,Harvested,2.44,T,F,F,F,F,F
US,Vegetable,2010,Yield,15.8,T,F,F,F,F,F
US,Vegetable,2010,Production,6.48,T,F,F,F,F,F
US,Vegetable,2010,Derived Yield,(2.44+15.2)/(6.48+2.66),T,T,F,F,F,F
US,Vegetable,2010,Derived Yield,(2.44+7)/(6.48+5),T,F,T,F,F,F
US,Vegetable,2010,Derived Yield,(2.44+15.2+7)/(6.48+2.66+5),T,T,T,F,F,F
US,Vegetable,2011,Harvested,6,T,F,F,F,F,F
US,Vegetable,2011,Yield,18,T,F,F,F,F,F
US,Vegetable,2011,Production,3,T,F,F,F,F,F
US,Vegetable,2011,Derived Yield,(6+10)/(3+9),T,T,F,F,F,F
US,Vegetable,2011,Derived Yield,(6+2)/(3+3),T,F,T,F,F,F
US,Vegetable,2011,Derived Yield,(6+10+2)/(3+9+3),T,T,T,F,F,F
Argentina,Vegetable,2010,Harvested,15.2,F,T,F,F,F,F
Argentina,Vegetable,2010,Yield,40.5,F,T,F,F,F,F
Argentina,Vegetable,2010,Production,2.66,F,T,F,F,F,F
Argentina,Vegetable,2010,Derived Yield,(2.44+15.2)/(6.48+2.66),T,T,F,F,F,F
Argentina,Vegetable,2010,Derived Yield,(15.2+7)/(2.66+5),F,T,T,F,F,F
Argentina,Vegetable,2010,Derived Yield,(2.44+15.2+7)/(6.48+2.66+5),T,T,T,F,F,F
Argentina,Vegetable,2011,Harvested,10,F,T,F,F,F,F
Argentina,Vegetable,2011,Yield,90,F,T,F,F,F,F
Argentina,Vegetable,2011,Production,9,F,T,F,F,F,F
Argentina,Vegetable,2011,Derived Yield,(6+10)/(3+9),T,T,F,F,F,F
Argentina,Vegetable,2011,Derived Yield,(10+2)/(9+3),F,T,T,F,F,F
Argentina,Vegetable,2011,Derived Yield,(6+10+2)/(3+9+3),T,T,T,F,F,F
Bhutan,Vegetable,2010,Harvested,7,F,F,T,F,F,F
Bhutan,Vegetable,2010,Yield,35,F,F,T,F,F,F
Bhutan,Vegetable,2010,Production,5,F,F,T,F,F,F
Bhutan,Vegetable,2010,Derived Yield,(2.44+7)/(6.48+5),T,F,T,F,F,F
Bhutan,Vegetable,2010,Derived Yield,(15.2+7)/(2.66+5),F,T,T,F,F,F
Bhutan,Vegetable,2010,Derived Yield,(2.44+15.2+7)/(6.48+2.66+5),T,T,T,F,F,F
Bhutan,Vegetable,2011,Harvested,2,F,F,T,F,F,F
Bhutan,Vegetable,2011,Yield,6,F,F,T,F,F,F
Bhutan,Vegetable,2011,Production,3,F,F,T,F,F,F
Bhutan,Vegetable,2011,Derived Yield,(2.44+7)/(6.48+5),T,F,T,F,F,F
Bhutan,Vegetable,2011,Derived Yield,(10+2)/(9+3),F,T,T,F,F,F
Bhutan,Vegetable,2011,Derived Yield,(6+10+2)/(3+9+3),T,T,T,F,F,F

Изображение ожидаемых выше выходных данных для структурированного просмотра:

Часть 1 -

Part 1

Часть 2 -

Part 2

Формулы для заполнения поля суммы для производного типа:

Производная сумма = Сумма Собран урожай всех стран с T (True), сгруппированных по столбцам «Год» и «Товар» , деленный на Сумма производства всех стран с T (True), сгруппированных по столбцам «Год» и «Товар».

Итак, Цель состоит в том, чтобы получить комбинацию всех стран из источника и вычислить сумму соответствующих значений урожая и производства, которые затем необходимо разделить. Товар может быть более чем одним в фактическом сценарии для любой данной страны, но это не должно беспокоить, поскольку суммирование суммы происходит по сгруппированному товару и году.

Примечание: пользователи во внешнем интерфейсе могут выбрать любую комбинацию стран. Единственная цель делать это в бэкэнде, а не динамически делать это во фронтенде, заключается в том, что AWS QuickSight (наш инструмент визуализации), хотя и может заполнять сумму в выбранных фильтрах столбца, но еще не поддерживает вычисление по этим производным суммированным полям. . Следовательно, весь расчет для всей комбинации стран должен быть предварительно заполнен (очень наивный подход), чтобы сделать его доступным в отчете по динамике c выбор стран пользователями.

Также, если вы любой лучший подход (чем вышеупомянутый наивный подход, упомянутый в примечании) для решения этой проблемы, вы можете направить меня. Я также разместил вопрос по той же проблеме, не написав свой ожидаемый подход для экспертов, чтобы показать мне, как мы можем решить эту проблему лучше, чем этот наивный подход. Если вы хотите помочь решить эту проблему с помощью другой техники, добро пожаловать, вот ссылка на этот вопрос.

Любая помощь будет принята с благодарностью.

...