sparksql对数值类型的字段排序错乱的问题
- 我们使用spark读取文本文件进行数据列的排序处理,发现排序并没有按预想的顺序。
原因是数据从文本读入spark的时候,都是按照字符串来处理的,这里直接排序的话也是以字符顺序排序,并未按数字排序。 - 源数据score.txt如下:
korry,Chinese,90
korry,Math,100
korry,Englis,96
korry,Art,80
korry,Physics,98
korry,History,86
- 处理数据代码如下:
//读取数据,创建临时表
sc.textFIle(score.txt)
.map(x => x.split(","))
.map(x =>(x(0),x(1),x(2)))
.toDF("name","subject","score")
.createOrReplaceTempView("scoreInfo")
//对成绩表进行排序处理
spark.sql("select * from scoreInfo order by score desc").show()
- 结果如下:
name | subject | score |
---|---|---|
korry | Math | 100 |
korry | Art | 80 |
korry | History | 86 |
korry | Chinese | 90 |
korry | English | 96 |
korry | Physics | 98 |
如上结果显示,很显然没有按预想的成绩顺序排序。
解决办法
- 读入数据的时候对数值列做处理
//读取数据,创建临时表
sc.textFIle(score.txt)
.map(x => x.split(","))
.map(x =>(x(0),x(1),x(2).toInt))
.toDF("name","subject","score")
.createOrReplaceTempView("scoreInfo")
//对成绩表进行排序处理
spark.sql("select * from scoreInfo order by score desc").show()
- 在排序的时候对数值列做处理
//读取数据,创建临时表
sc.textFIle(score.txt)
.map(x => x.split(","))
.map(x =>(x(0),x(1),x(2)))
.toDF("name","subject","score")
.createOrReplaceTempView("scoreInfo")
//对成绩表进行排序处理
spark.sql("select * from scoreInfo order by cast(score as int) desc").show()
- 结果如下:
name | subject | score |
---|---|---|
korry | Math | 100 |
korry | Physics | 98 |
korry | English | 96 |
korry | Chinese | 90 |
korry | History | 86 |
korry | Art | 80 |
现在排序结果就没有问题啦!