最近工作中把一些sql.sh脚本执行hive的语句升级为spark2.1版本,其中遇到将case when 替换为scala操作df的方式实现的问题:

代码数据:

  1. scala> import org.apache.spark.sql.functions._
  2. import org.apache.spark.sql.functions._
  3.  
  4. scala> import spark.implicits._
  5. import spark.implicits._
  6.  
  7. scala> case class fpb_servercls(gridid: String, height: Int, objectid: Int, rsrp: Double, calibrategridid: Int, calibartetype: String)
  8. defined class fpb_servercls
  9.  
  10. scala>
  11. | val fpb_server_test = List(
  12. | fpb_servercls("grid1", 0, 888888, -88, 53, null),
  13. | fpb_servercls("grid1", 5, 888888, -99, 53, null),
  14. | fpb_servercls("grid2", 0, 333333, -78, 53, null),
  15. | fpb_servercls("grid4", 0, 444444, -78, 53, null)
  16. | ).toDF
  17. fpb_server_test: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
  18.  
  19. scala> val sampe_data_test = List(
  20. | fpb_servercls("grid1", 0, 888888, -78, 53, "HOMEWIFI"),
  21. | fpb_servercls("grid1", 5, 999999, -89, 53, null),
  22. | fpb_servercls("grid2", 0, 333333, -87, 53, null)
  23. | ).toDF
  24. sampe_data_test: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]

错误代码:

  1. scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
  2. | fpb_server_test("gridid") === sampe_data_test("gridid")
  3. | && fpb_server_test("height") === sampe_data_test("height")
  4. | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
    | .select(
  5. | fpb_server_test("gridid"),
  6. | fpb_server_test("height"),
  7. | fpb_server_test("objectid"),
  8. | when(sampe_data_test("gridid") === lit(null), fpb_server_test("rsrp")).otherwise(sampe_data_test("rsrp")).alias("rsrp"),
  9. | fpb_server_test("calibrategridid"),
  10. | when(sampe_data_test("gridid") === lit(null), fpb_server_test("calibartetype")).otherwise(sampe_data_test("calibartetype")).alias("f_calibartetype")
  11. | )
  12. temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
  13.  
  14. scala> temp_result.show
  15. +------+------+--------+-----+---------------+---------------+
  16. |gridid|height|objectid| rsrp|calibrategridid|f_calibartetype|
  17. +------+------+--------+-----+---------------+---------------+
  18. | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
  19. | grid1| 5| 888888| null| 53| null|
  20. | grid2| 0| 333333|-87.0| 53| null|
  21. | grid4| 0| 444444| null| 53| null|
  22. +------+------+--------+-----+---------------+---------------+

错误的愿意就是这里的判定是否为空的地方。

正确用法:

  1. scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
  2. | fpb_server_test("gridid") === sampe_data_test("gridid")
  3. | && fpb_server_test("height") === sampe_data_test("height")
  4. | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
    | .select(
  5. | fpb_server_test("gridid"),
  6. | fpb_server_test("height"),
  7. | fpb_server_test("objectid"),
  8. | when(sampe_data_test("gridid").isNull, fpb_server_test("rsrp")).otherwise(sampe_data_test("rsrp")).alias("rsrp"),
  9. | fpb_server_test("calibrategridid"),
  10. | when(sampe_data_test("gridid").isNull, fpb_server_test("calibartetype")).otherwise(sampe_data_test("calibartetype")).alias("f_calibartetype")
  11. | )
  12. temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
  13.  
  14. scala> temp_result.show
  15. +------+------+--------+-----+---------------+---------------+
  16. |gridid|height|objectid| rsrp|calibrategridid|f_calibartetype|
  17. +------+------+--------+-----+---------------+---------------+
  18. | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
  19. | grid1| 5| 888888|-99.0| 53| null|
  20. | grid2| 0| 333333|-87.0| 53| null|
  21. | grid4| 0| 444444|-78.0| 53| null|
  22. +------+------+--------+-----+---------------+---------------+

疑问代码,如下代码在spark-shell中执行没有问题,但是使用spark-submit提交脚本后就提示错误:

  1. scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
  2. | fpb_server_test("gridid") === sampe_data_test("gridid")
  3. | && fpb_server_test("height") === sampe_data_test("height")
  4. | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
    | .selectExpr("fpb.gridid", "fpb.height", "fpb.objectid",
  5. | "(case when sample.gridid is null then fpb.rsrp else sample.rsrp end) as rsrp",
  6. | "fpb.calibrategridid",
  7. | "(case when sample.gridid is null then fpb.calibartetype else sample.calibartetype end) as calibartetype")
  8. temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
  9.  
  10. scala> temp_result.show
  11. +------+------+--------+-----+---------------+-------------+
  12. |gridid|height|objectid| rsrp|calibrategridid|calibartetype|
  13. +------+------+--------+-----+---------------+-------------+
  14. | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
  15. | grid1| 5| 888888|-99.0| 53| null|
  16. | grid2| 0| 333333|-87.0| 53| null|
  17. | grid4| 0| 444444|-78.0| 53| null|
  18. +------+------+--------+-----+---------------+-------------+

spark2.1:使用df.select(when(a===b,1).otherwise(0))替换(case when a==b then 1 else 0 end)的更多相关文章

  1. SQL case when else 语句:选出年份等于1970的,选出的结果用科目和获奖者排序,同时把经济和化学2科放到最后:SELECT * FROM nobel_win WHERE year=1970 ORDER BY CASE WHEN subject IN ('Economics','Chemistry') THEN 1 ELSE 0 END ASC, subject, winner;

    SELECT * FROM nobel_win WHERE year=1970 ORDER BY  CASE WHEN subject IN ('Economics','Chemistry') THE ...

  2. Oracle select 中case 的使用以及使用decode替换case

    表结构如下: 将money<50的显示为贫农,money<80的显示为中农,其他的显示为富农,sql 语句如下 select name, case then '贫农' then '中农' ...

  3. 滚动条--nicescroll插件(兼容各种浏览器,低至IE5)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. jquery.nicescroll.min.js滚动条插件的用法

    1.jquery.nicescroll.min.js源码 /* jquery.nicescroll 3.6.8 InuYaksa*2015 MIT http://nicescroll.areaaper ...

  5. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  7. 深入了解SQL注入绕过waf和过滤机制

    知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...

  8. ACM: Gym 100935G Board Game - DFS暴力搜索

    Board Game Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u  Gym 100 ...

  9. 学生各门课程成绩统计SQL语句大全

    学生成绩表(stuscore): 姓名:name 课程:subject 分数:score 学号:stuid 张三 数学 89 1 张三 语文 80 1 张三 英语 70 1 李四 数学 90 2 李四 ...

随机推荐

  1. WebGL 3D 电信机架实战之数据绑定

    前言 在前端中,视图层和数据层需要进行单向或者双向数据绑定,大家都已经不陌生了,有时候 2D 做的比较顺了之后,就会想要挑战一下 3D,不然总觉得痒痒的.这个 3D 机架的 Demo 我觉得非常有代表 ...

  2. 解决 python 中,时间日期不能序列化的问题

    在python 中, 你在数据库娶到了数据中如果含有时间日期,那么你在向前端作为json对象传递的时候呢,就会报错.大致如下: TypeError: datetime.datetime(2017, 1 ...

  3. Lombok介绍、使用方法和总结

    1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...

  4. Spring Boot应用的后台运行配置

    酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...

  5. Axure RP初学

    制作商品购买页

  6. 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen

    reportgen v0.1.8 更新介绍 这段时间,我对 reportgen 进行了大工程量的修改和更新.将之前在各个文章中出现的函数进行了封装,同时也对现有工具包的一些逻辑进行了调整. 1.rep ...

  7. C#,一份超简单的数据库帮助类,SqlHelp

    简单,实用,留存. using System; using System.Collections.Generic; using System.Configuration; using System.D ...

  8. nodejs安装和卸载

    Ubuntu 上安装 Node.js 方式一:直接安装    一.安装 1.$ sudo apt-get install nodejs2.$ sudo apt-get install npm二.升级 ...

  9. 2017年秋软工-领跑衫获奖感言&我最感谢的人

    啥都不说,先上幅图.获得领跑衫,开心. 一.回忆 这是我第二次来上恩师杨的软件工程,第一次是2016年春,那时候我还是本科三年级的学生.忘了第一次为啥去蹭课,印象中是我的榜样亮哥把我给忽悠过去的?我也 ...

  10. [福大软工教学] W班 第1次成绩排行榜

    作业地址 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/837 作业要求 (1)回想一下你初入大学时对 ...