首页 > 数据库 >大数据不就是写sql吗?—— Hive:把sql解析后用MapReduce跑 SparkSQL:把sql解析后用Spark跑,比hive快点

大数据不就是写sql吗?—— Hive:把sql解析后用MapReduce跑 SparkSQL:把sql解析后用Spark跑,比hive快点

时间:2023-08-03 21:03:55浏览次数:35  
标签:后用 ... 存储 join sql 引擎 SQL 解析

应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句:

 

"不就是写SQL吗,要那么久吗"

 

我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki:

 

贴出来给大家看看,省略了一些敏感的内容。

当然内部版言辞也会温和一点,嘻嘻

在哪里写SQL?

 

这个问题高级点的问法是用哪种SQL引擎?

 

SparkSQL、Hive、Phoenix、Drill、Impala、Presto、Druid、Kylin (这里的SQL引擎是广义的,大家不必钻牛角尖)

 

我用一句话简单概括下这几个东西,先不管你们现在看不看得懂:

  • Hive:把sql解析后用MapReduce跑
  • SparkSQL:把sql解析后用Spark跑,比hive快点
  • Phoenix:一个绕过了MapReduce运行在HBase上的SQL框架
  • Drill/Impala/Presto:交互式查询OLAP,都是类似google Dremel的东西,区别这里就不说了
  • Druid/Kylin:强调预计算,同样是OLAP

 

这就涉及到更多的问题了,对这些组件不熟悉的同学可能调研过程就得花上一个多月。

比如:需求是实时计算还是离线分析?

数据是增量数据还是静态数据?

数据量有多大?

能容忍多长的响应时间?

总之,功能、性能、稳定性、运维难度、开发难度这些都是要考虑的

对哪里的数据执行SQL?

 

你以为选完引擎就可以开写了?too naive!

上面提到的大部分工具都仅仅是查询引擎,存储呢?

“啥,为啥还要管存储?”

不管存储,那是要把PB级的数据存在mysql是吧...


关系型数据库像mysql这种,查询引擎和存储是紧耦合的,这其实是有助于优化性能的,你不能把它们拆分开来。

而大数据系统SQL引擎一般都是独立于数据存储系统,获得了更大的灵活性。这都是出于数据量和性能的考虑。


这涉及到的问题就更多了。先要搞清楚引擎支持对接哪些存储,怎么存查询起来方便高效。

可以持久化存储的工具有哪些,我有个图,感受一下(这只是一小部分)

用哪种语法写SQL?

 

你以为存储和查询搞定就可以开写了?你以为全天下的sql都是一样的?并不是!

并不是所有的引擎都支持join;

并不是所有的distinct都是精准计算的;

并不是所有的引擎都支持limit分页;

还有,如果处理复杂的场景经常会需要自定义sql方法,那如何自定义呢,写代码呀。

 

举几个简单而常见的栗子:

 

见过这样的sql吗?

select`user`["user_id"] from tbl_test ;

 

见过这种操作吗?

insert overwrite table tbl_test selectfromwhere;

 

卧槽,这不会锁死吗?hive里不会,但是不建议这样做。

还能这么写

fromselectwhere;

怎么用更高效的方式写SQL?

 

好了,全都搞定了,终于可以开始愉快地写SQL了。

写SQL的过程我用小祖刚来公司时的一句话来总结:

“卧槽,这条SQL有100多行!”

 

事实表,维表的数据各种join反复join,这还不算完还要再join不同时间的数据,还要$#@%^$#^...

 

不说了,写过的人一定知道有多恶心(此处省略100多行字)

 

终于写完了,千辛万苦来到这一步,满心欢喜敲下回车...

时间过去1分钟...

10分钟...

30分钟...

1小时...

2小时...

......

 

别等了,这样下去是不会有结果的。

 

老实看日志吧,看日志也是一门很大的学问。

 

首先你得搞清楚这个sql是怎么运行,底层是mapReduce还是spark还是解析成了其他应用的put、get等接口;

然后得搞清楚数据是怎么走的,有没有发生数据倾斜,怎么优化。

同时你还得注意资源,cpu、内存、io等

最后

 

产品又来需求了,现有系统还无法实现,上面四步再折腾一遍...

是的,我们就是写SQL。

标签:后用,...,存储,join,sql,引擎,SQL,解析
From: https://blog.51cto.com/u_11908275/6953155

相关文章

  • InnoDB – the best storage engine for MySQL?
    https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html InnoDBisageneral-purposestorageenginethatbalanceshighreliabilityandhighperformance.InnoDB是一个通用的存储引擎,平衡了高可靠性和高性能。InMySQL5.7,InnoDBisthedefaultMySQLsto......
  • Linux之DNS域名解析服务
    目录一、DNS二、正向解析一、DNSDNS:将域名转化成ip地址原因:因为ip地址太难记忆了方法一:本地host文件分散式:网络环境www.baidu.comhost文件有直接访问没有的话去找dns缓存dns缓存服务器有直接告诉你没有才会去问根域服务器根域服务器的他管理的主机域类型ww......
  • SQL 标准历史(比如 isolation in SQL-92)
      https://learnsql.com/blog/history-of-sql-standards/ HastheSQLstandardchangedinthe30+yearsit'sbeenaround?Absolutely!LearnaboutthejourneyfromSQL-86tomodernSQL,today’sstandarddatalanguage.SQLwas createdintheearly1970s......
  • 搭建Mysql主从复制
    文章目录1、MySQL支持的复制类型2、MySQL主从复制的工作过程3、搭建步骤步骤1:环境准备步骤2:主从服务器时间同步步骤3:配置主服务器步骤4:创建从服务器账户步骤5:配置从服务器步骤4:启动从服务器复制4、主从延迟问题5、结论MySQL主从复制是一种常用的数据库高可用性解决方案,可以提高......
  • OceanBase数据字典视图学习与总结(MySQL模式)
    OceanBase数据库的系统视图分为字典视图和性能视图。其中字典视图就是描述数据字典的视图,OceanBase数据库的字典视图包含information_schema.*视图、oceanbase.CDB_*视图、oceanbase.DBA_*视图以及mysql.*视图。本文所涉及的版本主要为OceanBase4.1.0。information_schema......
  • 2023.8.3 周四:SQL
    1#SQL语句可以单行或者多行书写,以分号结尾2#MySql数据库的SQL不区分大小写,关键字建议使用大写3#注释:4#单行注释:--注释内容或者#注释内容(MySQL特有)5#多行注释:/*注释内容*/67/*8DDL:操作数据库,表等;9DML:对表中的数据进行增删改;10DQL:对表中......
  • 记录一下Linux下远程访问Mysql连接不上,报错The driver has not received any packets
    问题所在远程服务器已经提前安装好了MySQL,版本也是对应的。在ssh上可以正常进入MySQL数据库。但是其他地方无法连接上,例如navicat和IDE内部都发生报错。排查1.首先排查了一下远程服务器上mysql服务状态是否处于正常运行状态sudoservicemysqldstatus没有发生问题。2.检......
  • CTFer成长记录——CTF之Web专题·极客大挑战—BabySQL
    一、题目链接https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]BabySQL二、解法步骤  本题是SQL注入,那么先尝试万能密码:1'or1=1#  发现or后面的东西都失效了,猜测对or进行了过滤,这里用双写绕过试试:1'oorr1=1#:  登陆成功。接......
  • 这些年写过的花式sql 第2句 统计用户返佣金排名
    第2句统计用户返佣金排名继续欢迎批评指正建议^^需求:曾经的活动是购买订单返流量(日志在flow_rebate_log),后来改成返佣金(日志在money_rebate_log)。现在需要按照用户返佣金额排名,如果不存在金额,则按返流量排名。其他需要列出的字段:username(用户名连接users表获得),用户......
  • 堆 Heap & 栈 Stack(.Net)【概念解析系列_3】【C# 基础】
    〇、前言本文主要围绕.Net框架中的托管堆(Heap,简称堆)和堆栈(Stack,简称栈)展开。.Net程序在CLR(CommonLanguageRuntime公共语言运行时)上运行时,内存被从逻辑上划分为两个主要部分:堆和栈。除了栈和堆之外,CLR还维护了其他一些内存区域,例如静态存储区域(StaticStorageArea)、常量......