Spark SQL 可为空的 unicode 字符串排名

Spark SQL Ranking for nullable unicode strings

我们正在开发 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

我还没有对此进行测试 - 但我猜你最好将它们分成另一组,然后先对其进行排序。然后应用你想要的真实排名:

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

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

我的结果: