多条件查询:
- 分步骤,先根据单个条件写sql语句
- 整合:
select * from ( 满足条件1的语句 ) t1 , ( 满足条件2的语句 ) t2 where 条件1 and 条件2 … - 优化sql
object Unti_5 extends App {
val conf = new SparkConf().setAppName("").setMaster("local")
val sc = new SparkContext(conf)
val spark = SparkSession.builder().config(conf).getOrCreate()
import spark.implicits._
var rdd2 = spark.read.textFile("f:/ab/input").map(_.split("\t")).map(x => (x(0), x(1).toInt, x(2).toInt, x(3).toInt, x(4).toInt))
val df = rdd2.toDF("name", "a1", "a2", "a3", "a4")
df.createOrReplaceTempView("s")
spark.sql("select * from s").show(50)
//根据第四季度降水量阶梯分组,分组办法为0-500为一组、500-100为一组、1000-1500为一组、1500-2000为一组、大于2000为一组; 求每组当中全年GDP量最高的省份
//1. a4/500 进行分组; div:整除
// spark.sql("select *,(a4 div 500) flag from s ").show
//2. 求最大
// spark.sql("select flag,max(a1+a2+a3+a4) max_s from (select (a4 div 500) flag,* from s) group by flag ").show()
//3. 同时满足 分组 和 最大 的两个条件 ,即从2个结果集找公共
// spark.sql("select flag,max(a1+a2+a3+a4) max_s from (select (a4 div 500) flag,* from s) group by flag ").show()
spark.sql("select t1.* from (select *,(a4 div 500) flag from s ) t1,(select flag,max(a1+a2+a3+a4) max_s from (select (a4 div 500) flag,* from s) group by flag ) t2 where t1.flag = t2.flag and (t1.a1+t1.a2+t1.a3+t1.a4) = t2.max_s").show
}
结果:
+--------+----+----+----+----+
| name| a1| a2| a3| a4|
+--------+----+----+----+----+
| 北京市| 500| 900| 300| 300|
| 天津市| 500| 500| 600| 600|
| 上海市| 800|1200| 500| 500|
| 重庆市| 200| 300| 800| 800|
| 河北省| 800|1700| 200| 200|
| 山西省| 900| 200| 800|1200|
| 辽宁省| 500|1800| 900| 300|
| 吉林省|1200|1900| 500|1700|
| 黑龙江省| 300| 900|1200| 200|
| 江苏省|1700| 700| 300|1800|
| 浙江省| 200| 300|1700|1900|
| 安徽省|1800| 300| 200| 900|
| 福建省|1900| 600|1800| 700|
| 江西省| 900| 500|1900| 300|
| 山东省| 700| 800| 500| 600|
| 河南省| 300| 200|1200| 500|
| 湖北省| 600| 800| 300| 800|
| 湖南省| 500| 900|1700| 200|
| 广东省| 800| 500| 200| 800|
| 海南省| 200|1200|1800| 900|
| 四川省| 800| 300|1900| 300|
| 贵州省| 900|1700| 900| 600|
| 云南省| 500| 200| 700| 500|
| 陕西省|1200|1800| 300| 800|
| 甘肃省| 300|1900| 600| 200|
| 青海省|1700|1800| 700| 800|
| 台湾省| 200|1900| 300| 900|
| 内蒙古自治区|1800| 500| 600| 500|
| 广西壮族自治区|1900|1200| 500|1200|
| 西藏自治区| 900| 300| 800| 300|
| 宁夏回族自治区| 700|1700| 200|1700|
|新疆维吾尔自治区| 300| 200| 800| 200|
| 香港特别行政区| 600|1800| 900|1800|
| 澳门特别行政区| 800|1900| 300|1900|
+--------+----+----+----+----+
+-------+----+----+----+----+----+
| name| a1| a2| a3| a4|flag|
+-------+----+----+----+----+----+
| 吉林省|1200|1900| 500|1700| 3|
| 福建省|1900| 600|1800| 700| 1|
| 江西省| 900| 500|1900| 300| 0|
| 青海省|1700|1800| 700| 800| 1|
|广西壮族自治区|1900|1200| 500|1200| 2|
+-------+----+----+----+----+----+