Spark SQL历险记
现在的spark sql编程通常使用scala api 以及 java api的方式,相比于直接使用 spark sql语句,spark api灵活很多,毕竟可以基于dataset以及rdd两种方式进行操作,不过spark sql的坑就有点多了。
1,getClass.getResourceAsStream这个类,网上通常说的是不加"/"是从当前包读取,加了"/"是从根class路径读取,但是根路径并不是在idea或者文件下看到的诸如src/main/resource/这样的路径,而是最终打包时候生成的jar的时候的格式,在生成jar包的时候resource文件夹下会被展开到根路径下,所以如果要加载resource下的资源,只需要"/资源名"就可以了
2、select crossInfo, split(crossInfo, '|') as jda from tem_test_yy lateral view explode(split(jdaList, '#')) tmpTable as crossInfo
这个语句有bug,返回的结果是
jda1||time1 ["j","d","a","","|","","|","t","i","m","e","",""]
jda1||time1 ["j","d","a","","|","","|","t","i","m","e","",""]
jda2||time2 ["j","d","a","","|","","|","t","i","m","e","",""]
jda3||time3 ["|","j","d","a","","|","","|","t","i","m","e","",""]
主要原因是hive里面|字符要使用转义符号!!,所以正确用法是split(crossInfo, '\\|');
3、spark persist不能乱用,尤其是
MEMORY_AND_DISK_SER
级别,对于大表来说,persist效率远不如多执行一遍。。对于几十亿级别的表,效率可降低数倍。。
4、dataframe = dataset[row] ,spark map里面的匿名函数返回值不能是dataset[row],否则会报序列化错误,它只支持dataset[class]的形式,需要在返回以后 在driver端通过 dataset[row].toDF()转成 dataframe也就是dataset[row]才行。但是dataset[row]可以作为map的输入。
5、scala selet("_1.*")和select($"_1"),如果处理的是Tuple[_1,_2]类型的dataset,
后者会生成如下的schema
|-- _1: struct (nullable = true)
| |-- all_jda: string (nullable = true)
| |-- user_visit_ip: string (nullable = true)
| |-- sequence_num: integer (nullable = true)
前者是生成如下的schema
| -- all_jda: string (nullable = true)
| -- user_visit_ip: string (nullable = true)
| -- sequence_num: integer (nullable = true)
这绝对是一个坑=。=,后者会把多一层schema结构,而在spark sql语句中是能直接取到非顶层的列的。。
6、spark sql的一些问题
(1), hive支持使用正则语句,spark sql 不支持
(2), left out join on A.column = B.column 而不能写成 left out join on column;
(3), select * from A left out join B on cloumn会造成ambigious错误 需要小心
(4), concat_ws不支持对除String外的其他类型数组的连接,需要自己实现一个udf
Spark SQL历险记的更多相关文章
- Spark SQL 之 Data Sources
#Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...
- Spark SQL 之 DataFrame
Spark SQL 之 DataFrame 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述(Overview) Spark SQL是Spark的一个组件,用于结构化 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南
Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...
- Spark SQL Example
Spark SQL Example This example demonstrates how to use sqlContext.sql to create and load a table ...
- 通过Spark SQL关联查询两个HDFS上的文件操作
order_created.txt 订单编号 订单创建时间 -- :: -- :: -- :: -- :: -- :: order_picked.txt 订单编号 订单提取时间 -- :: ...
- Spark SQL 之 Migration Guide
Spark SQL 之 Migration Guide 支持的Hive功能 转载请注明出处:http://www.cnblogs.com/BYRans/ Migration Guide 与Hive的兼 ...
- Spark SQL 官方文档-中文翻译
Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...
- Spark SQL 之 Performance Tuning & Distributed SQL Engine
Spark SQL 之 Performance Tuning & Distributed SQL Engine 转载请注明出处:http://www.cnblogs.com/BYRans/ 缓 ...
随机推荐
- spring boot 添加拦截器的简单实例(springBoot 2.x版本,添加拦截器,静态资源不可访问解决方法)
spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor 一.HandlerInterceptor HandlerInterceptor是s ...
- Linux 查看负载内存
负载 内存 1.作用 top命令用来显示执行中的程序进程,使用权限是所有用户. 2.格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 3.主要参数 ...
- 一些值得深入学习和借鉴的 .Net 开源项目
1.DotNetFramework .NET Reference Source 发布了 beta 版,可以在线浏览 .NET Framework 4.5.1 的源代码,并且可以通过配置,在 Visu ...
- java代码获取多边形的中心点
package com.skjd.util; import java.util.ArrayList; import java.util.List; /** * 坐标以及电子围栏相关的工具类 * @au ...
- HihoCoder1338 A Game (区间DP)
<题目链接> 题目大意: 两个人轮流从一个序列中取数,他们都面临同样的二选一决策:是拿走最左边的数,还是拿走最右边的数?问先手最多能够得到的分数是多少. 解题分析: 一道比较经典的DP,因 ...
- 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)
题意: 有一个骆驼,n个绿洲遍布在数轴上,第i个绿洲的坐标为x[i],保证x[i]单增.骆驼的驼峰有体积初始值V.当驼峰的体积变为v的时候,驼峰中至多只能够存储v L的水.骆驼希望走完所有的绿洲,并且 ...
- buffer格式的转换
---恢复内容开始--- 定义好一个buffer 例如: var buf = new Buffer(''nihaoya); 通过str转成base64的字符 var str =buf.toString ...
- VS2013安装Boost
boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...
- JavaScript学习day2 (基本语法上)
知识点 JavaScript 的变量 数据类型 运算符 JavaScript 的动态类型 变量:(变量的命名规则和其他语言类似) 由数字,字母,下划线组成,区分大小写 以字母开头 变量名不能有空格 不 ...
- javascript的数组之pop()
pop()方法从数组中删除最后一个元素,并返回该元素的值.此方法更改数组的长度. let a = [1, 2, 3]; a.length; a.pop(); console.log(a); // [1 ...