代码之家  ›  专栏  ›  技术社区  ›  Venkataraman R

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

  •  1
  • Venkataraman R  · 技术社区  · 6 年前

    我们正在研究Spark SQL。我们正在使用一些可以为空的字符串字段进行排名。

    问题是:在Spark SQL中, null 价值观排名第一。但是,我们想要 无效的 最终的价值。所以,我们应用了一个逻辑案例。因为我们有Unicode数据,“zzzzzz”最终不会出现。它将在日语和中文地址行之前。

    请告诉我们,哪个字符串常量文本用于空字符串值,以便在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 回复  |  直到 6 年前
        1
  •  2
  •   wBob    6 年前

    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

        2
  •  1
  •   simon_dmorias    6 年前

    我还没有测试过这个——但是我猜你最好把它们分成另一组,然后首先对它们进行排序。然后应用你想要的真实排名:

    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