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 李四 ...
随机推荐
- c++趣味之shared_ptr额外好处
shared_ptr(sp)额外好处是什么?即使被转为基类,析构函数也可以正常执行. 已知两个类 class foo{}; class bar:foo{public:~bar(){}}; 先来看不用s ...
- 快速排序及优化(Java实现)
普通快速排序 找一个基准值base,然后一趟排序后让base左边的数都小于base,base右边的数都大于等于base.再分为两个子数组的排序.如此递归下去. public class QuickSo ...
- Linux find用法
Linux中find常见用法示例 ----摘抄哪里忘记了 ·find path -option [ -print ] [ -exec -ok command ] {} ...
- Python OJ 从入门到入门基础练习 10 题
1.天天向上的力量: 一年365天,以第1天的能力值为基数,记为1.0.当好好学习时,能力值相比前一天提高N‰:当没有学习时,由于遗忘等原因能力值相比前一天下降N‰.每天努力或放任,一年下来的能力值相 ...
- Algorithm --> Kruskal算法和Prim算法
最小生成树之Kruskal算法和Prim算法 Kruskal多用于稀疏图,prim多用于稠密图. 根据图的深度优先遍历和广度优先遍历,可以用最少的边连接所有的顶点,而且不会形成回路.这种连接所有顶点并 ...
- 爬虫(scrapy中调试文件)
在项目setting同级目录下创建py文件,代码如下: from scrapy.cmdline import execute import sys import os sys.path.append( ...
- 涉及模式之 装饰器模式详解(与IO不解的情缘)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...
- oracle exp(expdp)数据迁移(生产环境,进行数据对比校验)
前言:客户需要迁移XX 库 ZJJJ用户(迁移到其他数据库),由于业务复杂,客户都弄不清楚里面有哪些业务系统,为保持数据一致性,需要停止业务软件,中间件,杀掉oracle进程. 一.迁移数据倒出部分= ...
- Intellij Idea下tomcat设置自动编译
*eclipse默认tomcat下是自动完成编译:而Intellij Idea默认tomcat下不是自动完成编译,从如下开始设置: 进入"settings",如下图找到" ...
- 【R语言系列】read.table报错incomplete final line found by readTableHeader
文件内容: id,SGBH,DMSM1,SGDO,SGFSSJ 1,310117620,伤人事故,上海市,2018-03-02 20:04:00 2,310117621,死亡事故,杭州市,2018-0 ...