SQL Logi c для создания нового столбца на основе значений полей соответствия - PullRequest
0 голосов
/ 19 февраля 2020
Input:
CUST TAX_TYPE 
a      TIN    
a      TIN    
a      SSN    
b      TIN    
b      TIN     
b      TIN    
c      SSN    
c      SSN    
c      null
Output:
CUST TAX_TYPE VALID 
a      TIN     n
a      TIN     n
a      SSN     n
b      TIN     y
b      TIN     y 
b      TIN     y
c      SSN     n
c      SSN     n
c      null    n

Если один и тот же CUST имеет более одного TAX_TYPE, я должен пометить его как 'n', иначе, если тот же CUST имеет тот же tax_type, который я должен отметить как 'y' в столбце VALID. Кто-нибудь может предложить оптимизированный спарк-sql или стандартный sql (чтобы я мог преобразовать в спарк sql запрос) logi c запрос для этого сценария

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Попробуйте использовать when-otherwise для достижения желаемого результата

scala> import org.apache.spark.sql.expressions.Window

scala> var df =Seq(("a", "TIN" ), ("a", "TIN" ), ("a", "SSN" ), ("b", "TIN" ), ("b", "TIN" ), ("b", "TIN" ), ("c", "SSN" ), ("c", "SSN" ), ("c","null")).toDF("cust","tax_type")

scala> df.withColumn("valid",when(size(collect_set(col("tax_type")).over(Window.partitionBy(col("cust")).orderBy(col("cust"))))>1,"N").otherwise("Y")).orderBy("cust").show()
+----+--------+-----+
|cust|tax_type|valid|
+----+--------+-----+
|   a|     TIN|    N|
|   a|     SSN|    N|
|   a|     TIN|    N|
|   b|     TIN|    Y|
|   b|     TIN|    Y|
|   b|     TIN|    Y|
|   c|     SSN|    N|
|   c|     SSN|    N|
|   c|    null|    N|
+----+--------+-----+

Это позволит избежать всех расчетов min / max для каждой строки.

0 голосов
/ 19 февраля 2020

Используйте case и функции окна:

select t.*,
       (case when min(TAX_TYPE) over (partition by cust) = max(tax_type) over (partition by cust) and
                  count(*) over (partition by cust) = count(tax_type) over (partition by cust)
             then 'y' else 'n'
        end) as valid
from t;

Второе условие проверяет, что NULL значений нет.

...