Spark SQL ранжирование для обнуляемых строк Unicode - PullRequest
0 голосов
/ 22 января 2019

Мы работаем над Spark SQL. Мы делаем ранжирование, используя некоторые пустые строковые поля.

Проблема в том, что в Spark SQL значения null стоят на первом месте в рейтинге. Но мы хотим, чтобы значение null пришло в конце. Итак, мы применили логику CASE WHEN. Поскольку у нас есть данные Unicode, "ZZZZZZZZ" не придет в конце. Это будет впереди японских, китайских адресных линий.

Пожалуйста, дайте нам знать, какой строковый константный литерал использовать для нулевых строковых значений, чтобы они заканчивались в случае ORDER BY.

Я поместил пример кода ниже.

SELECT CompanyName, 
ROW_NUMBER() OVER
                    (
                        PARTITION BY O.CompanyName
                        ORDER BY  
                                 CASE WHEN AddressLine1 IS NOT NULL THEN AddressLine1 ELSE "ZZZZZZZZ" END ASC                                 
                    ) AS BestDataForCompany
FROM CompanyData

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Функции ранжирования в Spark SQL поддерживают аргумент NULLS LAST, поэтому он будет работать:

SELECT 
  CompanyName,
  AddressLine1,
  ROW_NUMBER() OVER ( PARTITION BY CompanyName ORDER BY AddressLine1 ) BestDataForCompany1,
  ROW_NUMBER() OVER ( PARTITION BY CompanyName ORDER BY CASE WHEN AddressLine1 IS NULL THEN 1 ELSE 0 END, AddressLine1 DESC ) BestDataForCompany2,
  ROW_NUMBER() OVER ( PARTITION BY CompanyName ORDER BY AddressLine1 NULLS LAST ) BestDataForCompany3  
FROM CompanyData

Мои результаты: enter image description here

0 голосов
/ 22 января 2019

Я не проверял это - но я предполагаю, что вам лучше было бы разбить их на другую группу, а затем отсортировать сначала. Затем примените реальный рейтинг, который вы хотите:

SELECT CompanyName, 
ROW_NUMBER() OVER
                    (
                        PARTITION BY O.CompanyName, CASE WHEN AddressLine1 IS NOT NULL THEN 0 ELSE 1 END
                        ORDER BY  
                                 CASE WHEN AddressLine1 IS NOT NULL THEN 0 ELSE 1 END, AddressLine1                                 
                    ) AS BestDataForCompany
FROM CompanyData
...