spark2.1:使用df.select(when(a===b,1).otherwise(0))替换(case when a==b then 1 else 0 end)
最近工作中把一些sql.sh脚本执行hive的语句升级为spark2.1版本,其中遇到将case when 替换为scala操作df的方式实现的问题:
代码数据:
- scala> import org.apache.spark.sql.functions._
- import org.apache.spark.sql.functions._
- scala> import spark.implicits._
- import spark.implicits._
- scala> case class fpb_servercls(gridid: String, height: Int, objectid: Int, rsrp: Double, calibrategridid: Int, calibartetype: String)
- defined class fpb_servercls
- scala>
- | val fpb_server_test = List(
- | fpb_servercls("grid1", 0, 888888, -88, 53, null),
- | fpb_servercls("grid1", 5, 888888, -99, 53, null),
- | fpb_servercls("grid2", 0, 333333, -78, 53, null),
- | fpb_servercls("grid4", 0, 444444, -78, 53, null)
- | ).toDF
- fpb_server_test: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
- scala> val sampe_data_test = List(
- | fpb_servercls("grid1", 0, 888888, -78, 53, "HOMEWIFI"),
- | fpb_servercls("grid1", 5, 999999, -89, 53, null),
- | fpb_servercls("grid2", 0, 333333, -87, 53, null)
- | ).toDF
- sampe_data_test: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
错误代码:
- scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
- | fpb_server_test("gridid") === sampe_data_test("gridid")
- | && fpb_server_test("height") === sampe_data_test("height")
- | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
| .select(- | fpb_server_test("gridid"),
- | fpb_server_test("height"),
- | fpb_server_test("objectid"),
- | when(sampe_data_test("gridid") === lit(null), fpb_server_test("rsrp")).otherwise(sampe_data_test("rsrp")).alias("rsrp"),
- | fpb_server_test("calibrategridid"),
- | when(sampe_data_test("gridid") === lit(null), fpb_server_test("calibartetype")).otherwise(sampe_data_test("calibartetype")).alias("f_calibartetype")
- | )
- temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
- scala> temp_result.show
- +------+------+--------+-----+---------------+---------------+
- |gridid|height|objectid| rsrp|calibrategridid|f_calibartetype|
- +------+------+--------+-----+---------------+---------------+
- | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
- | grid1| 5| 888888| null| 53| null|
- | grid2| 0| 333333|-87.0| 53| null|
- | grid4| 0| 444444| null| 53| null|
- +------+------+--------+-----+---------------+---------------+
错误的愿意就是这里的判定是否为空的地方。
正确用法:
- scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
- | fpb_server_test("gridid") === sampe_data_test("gridid")
- | && fpb_server_test("height") === sampe_data_test("height")
- | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
| .select(- | fpb_server_test("gridid"),
- | fpb_server_test("height"),
- | fpb_server_test("objectid"),
- | when(sampe_data_test("gridid").isNull, fpb_server_test("rsrp")).otherwise(sampe_data_test("rsrp")).alias("rsrp"),
- | fpb_server_test("calibrategridid"),
- | when(sampe_data_test("gridid").isNull, fpb_server_test("calibartetype")).otherwise(sampe_data_test("calibartetype")).alias("f_calibartetype")
- | )
- temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
- scala> temp_result.show
- +------+------+--------+-----+---------------+---------------+
- |gridid|height|objectid| rsrp|calibrategridid|f_calibartetype|
- +------+------+--------+-----+---------------+---------------+
- | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
- | grid1| 5| 888888|-99.0| 53| null|
- | grid2| 0| 333333|-87.0| 53| null|
- | grid4| 0| 444444|-78.0| 53| null|
- +------+------+--------+-----+---------------+---------------+
疑问代码,如下代码在spark-shell中执行没有问题,但是使用spark-submit提交脚本后就提示错误:
- scala> val temp_result = fpb_server_test.alias("fpb").join(sampe_data_test.alias("sample"),
- | fpb_server_test("gridid") === sampe_data_test("gridid")
- | && fpb_server_test("height") === sampe_data_test("height")
- | && fpb_server_test("objectid") === sampe_data_test("objectid"), "left_outer")
| .selectExpr("fpb.gridid", "fpb.height", "fpb.objectid",- | "(case when sample.gridid is null then fpb.rsrp else sample.rsrp end) as rsrp",
- | "fpb.calibrategridid",
- | "(case when sample.gridid is null then fpb.calibartetype else sample.calibartetype end) as calibartetype")
- temp_result: org.apache.spark.sql.DataFrame = [gridid: string, height: int ... 4 more fields]
- scala> temp_result.show
- +------+------+--------+-----+---------------+-------------+
- |gridid|height|objectid| rsrp|calibrategridid|calibartetype|
- +------+------+--------+-----+---------------+-------------+
- | grid1| 0| 888888|-78.0| 53| HOMEWIFI|
- | grid1| 5| 888888|-99.0| 53| null|
- | grid2| 0| 333333|-87.0| 53| null|
- | grid4| 0| 444444|-78.0| 53| null|
- +------+------+--------+-----+---------------+-------------+
spark2.1:使用df.select(when(a===b,1).otherwise(0))替换(case when a==b then 1 else 0 end)的更多相关文章
- 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 ...
- Oracle select 中case 的使用以及使用decode替换case
表结构如下: 将money<50的显示为贫农,money<80的显示为中农,其他的显示为富农,sql 语句如下 select name, case then '贫农' then '中农' ...
- 滚动条--nicescroll插件(兼容各种浏览器,低至IE5)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- jquery.nicescroll.min.js滚动条插件的用法
1.jquery.nicescroll.min.js源码 /* jquery.nicescroll 3.6.8 InuYaksa*2015 MIT http://nicescroll.areaaper ...
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...
- 深入了解SQL注入绕过waf和过滤机制
知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...
- ACM: Gym 100935G Board Game - DFS暴力搜索
Board Game Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Gym 100 ...
- 学生各门课程成绩统计SQL语句大全
学生成绩表(stuscore): 姓名:name 课程:subject 分数:score 学号:stuid 张三 数学 89 1 张三 语文 80 1 张三 英语 70 1 李四 数学 90 2 李四 ...
随机推荐
- WebGL 3D 电信机架实战之数据绑定
前言 在前端中,视图层和数据层需要进行单向或者双向数据绑定,大家都已经不陌生了,有时候 2D 做的比较顺了之后,就会想要挑战一下 3D,不然总觉得痒痒的.这个 3D 机架的 Demo 我觉得非常有代表 ...
- 解决 python 中,时间日期不能序列化的问题
在python 中, 你在数据库娶到了数据中如果含有时间日期,那么你在向前端作为json对象传递的时候呢,就会报错.大致如下: TypeError: datetime.datetime(2017, 1 ...
- Lombok介绍、使用方法和总结
1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...
- Spring Boot应用的后台运行配置
酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...
- Axure RP初学
制作商品购买页
- 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen
reportgen v0.1.8 更新介绍 这段时间,我对 reportgen 进行了大工程量的修改和更新.将之前在各个文章中出现的函数进行了封装,同时也对现有工具包的一些逻辑进行了调整. 1.rep ...
- C#,一份超简单的数据库帮助类,SqlHelp
简单,实用,留存. using System; using System.Collections.Generic; using System.Configuration; using System.D ...
- nodejs安装和卸载
Ubuntu 上安装 Node.js 方式一:直接安装 一.安装 1.$ sudo apt-get install nodejs2.$ sudo apt-get install npm二.升级 ...
- 2017年秋软工-领跑衫获奖感言&我最感谢的人
啥都不说,先上幅图.获得领跑衫,开心. 一.回忆 这是我第二次来上恩师杨的软件工程,第一次是2016年春,那时候我还是本科三年级的学生.忘了第一次为啥去蹭课,印象中是我的榜样亮哥把我给忽悠过去的?我也 ...
- [福大软工教学] W班 第1次成绩排行榜
作业地址 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/837 作业要求 (1)回想一下你初入大学时对 ...