1. sparksql:函数使用:concat_ws,collect_set,RANK, DENSE_RANK, ROW_NUMBER

函数查询:

https://spark.apache.org/docs/2.3.0/api/sql/index.html#map

concat_ws: 用指定的字符连接字符串

例如:

连接字符串:

concat_ws("_", field1, field2),输出结果将会是:“field1_field2”。

数组元素连接:

concat_ws("_", [a,b,c]),输出结果将会是:"a_b_c"。

 

collect_set: 把聚合的数据组合成一个数组,一般搭配group by 使用。

例如有下表T_course;

id    name    course
1    zhang san    Chinese
2    zhang san    Math
3    zhang san    English
spark.sql("select name, collect_set(course) as course_set from T_course group by name");

结果是:

name    course_set
zhang san    [Chinese,Math,English]

RANK, DENSE_RANK, ROW_NUMBER都是把表中的行按分区内的排序标上序号,但有一点差别

RANK:可以生成不连续的序号,比如按分数排序,第一第二都是100分,第三名98分,那第一第二就会显示序号1,第三名显示序号3。

DENSE_RANK: 生成连续的序号,在上一例子中,第一第二并列显示序号1,第三名会显示序号2。

ROW_NUMBER: 顾名思义就是行的数值,在上一例子中,第一第二第三将会显示序号为1,2,3。

 

下面的例子帮助理解,按年级分组,分数降序排列,分别新建列RANK, DENSE_RANK, ROW_NUMBER:
考试成绩排名
姓名    年级    分数    RANK    DENSE_RANK    ROW_NUMBER
张三    一年级    100    1    1    1
李四    一年级    100    1    1    2
王五    一年级    98    3    2    3
小明    二年级    100    1    1    1
小芳    二年级    95    2    2    2
小民    二年级    90    3    3    3
 

sparkSession.sql("SELECT * , " +
      "RANK() OVER (PARTITION BY grade ORDER BY score DESC) AS rank, " +
      "DENSE_RANK() OVER (PARTITION BY grade ORDER BY score DESC) AS dense_rank, " +
      "ROW_NUMBER() OVER (PARTITION BY grade ORDER BY score DESC) AS row_number " +
      "FROM ScoreDetail").show()

 

cast: select new column as null string in spark,默认null 作为新一列

select cast(null as string) as newcol from db.table