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
我的结果:
我们正在开发 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
我的结果: