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

"不就是写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 交互式查询,都是类似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 select * from tbl_test  where id>0; 

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

还能这么写

from tbl_test insert overwrite table tbl_test select *   where id>0; 

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

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

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

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

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

不说了,写过的人一定知道有多恶心

(此处省略100多行字)

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

时间过去1分钟...

10分钟...

30分钟...

1小时...

2小时...

......

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

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

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

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

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

最后

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

推荐阅读

大数据需要学什么?
zookeeper-操作与应用场景-《每日五分钟搞定大数据》
zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
zookeeper-paxos与一致性-《每日五分钟搞定大数据》
zookeeper-zab协议-《每日五分钟搞定大数据》

大数据不就是写SQL吗?的更多相关文章

  1. 应大数据时代而写了个磁力搜索的网页- WWW.MOVIH.COM 磁力

    应大数据时代而写了个磁力搜索的网页- 索马里搜索磁力 http://www.,movih.com/ BT磁力示例网站:WWW.MOVIH.COM 采用分布式架构: JAVA系统:JBOSS7+EJB3 ...

  2. 大数据量下的SQL Server数据库自身优化

    原文: http://www.d1net.com/bigdata/news/284983.html 1.1:增加次数据文件 从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情 ...

  3. 千万级大数据的Mysql数据库SQL语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. 大数据技术 - 为什么是SQL

    在大数据处理以及分析中 SQL 的普及率非常高,几乎是每一个大数据工程师必须掌握的语言,甚至非数据处理岗位的人也在学习使用 SQL.今天这篇文章就聊聊 SQL 在数据分析中作用以及掌握 SQL 的必要 ...

  5. 大数据学习资料之SQL与NOSQL数据库

    这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者.有自学hadoop的,有报名培训班学习的.所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境.修改配置文件测试 ...

  6. (转)大数据量下的SQL Server数据库优化

     在SQL Server中,默认MDF文件初始大小为5MB,自增为1MB,不限增长,LDF初始为1MB,增长为10%,限制文件增长到一定的数目:一般设计中,使用SQL自带的设计即可,但是大型数据库设计 ...

  7. 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...

  8. (转)大数据时代下的SQL Server第三方负载均衡方案----Moebius测试

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...

  9. 大数据学习——hive的sql练习题

    ABC三个hive表 每个表中都只有一列int类型且列名相同,求三个表中互不重复的数 create table a(age int) row format delimited fields termi ...

随机推荐

  1. git 入门教程之版本控制

    版本控制 我们知道 git 是分布式版本控制系统,所以称被控制对象是版本本身没错,但是从git 命令中发现,并没有版本这个名词,有的只是commit,所以前几节我一直称其为提交. 为了避免后续教程引发 ...

  2. mssql sqlserver 验证整型函数分享

    转自:http://www.maomao365.com/?p=6227 摘要: 下文将制作一个isnumber验证整型的函数,供在sql脚本中做数值判断,如下所示: 例: 实现原理:判断 是否包含特殊 ...

  3. Ubuntu下永久修改主机名和创建用户

    使用hostname 进行修改. 创建用户,修改密码

  4. Thinkphp框架中自定义修改success和error页面

    Thinkphp框架中自定义修改success和error页面 Thinkphp框架的默认success和error太难看,可以自定义设置,步骤如下: (注意:TP原框架中的success跳转有问题, ...

  5. JavaScript -- 时光流逝(七):js中的全局函数

    JavaScript -- 知识点回顾篇(七):js中的全局函数 全局函数可用于所有内建的 JavaScript 对象. (1) encodeURI():把字符串编码为 URI. <script ...

  6. Eclipse使用过程中的经验总结

    1.Eclipse中如何配置JDK的Documents和Sources? "Windows"-> "Preferences"-> "Jav ...

  7. TCP Health Checks

    This chapter describes how to configure health checks for TCP. Introduction NGINX and NGINX Plus can ...

  8. C#多线程编程のSemaphore(信号量,负责协调各个线程)

    Semaphore负责协调线程,可以限制对某一资源访问的线程数量 这里对SemaphoreSlim类的用法做一个简单的例子: namespace WpfApplication6 { /// <s ...

  9. [Android] ScrollView can host only one direct child

    android 采用ScrollView布局时出现异常:ScrollView can host only one direct child.主要是ScrollView内部只能有一个子元素,即不能并列两 ...

  10. [matlab] 4.M函数

    函数文件的编写 新建一个函数文件 函数的第一行的格式 :function [输出的参数] =函数名 (输入的参数) 输入和输出的参数可以有多个 保存函数文件的时候,注意文件名要和函数名一样 函数头和函 ...