【问题标题】:Spark SQL Ranking for nullable unicode strings可空 unicode 字符串的 Spark SQL 排名
【发布时间】:2019-01-22 07:22:09
【问题描述】:

我们正在研究 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

【问题讨论】:

    标签: apache-spark unicode null apache-spark-sql databricks


    【解决方案1】:

    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
    

    我的结果:

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 嗨 Simon,SparkSQL 实际上支持 NULLS LASTFIRST 的分区函数,因此不需要自定义 CASE 表达式。很棒吧?
      • 是的,同意。 Nulls last 是一个更好的解决方案。
      猜你喜欢
      • 2021-05-22
      • 1970-01-01
      • 2011-07-22
      • 2020-12-19
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2020-10-20
      • 2017-04-14
      相关资源
      最近更新 更多