某某茶叶有限公司欢迎您!
金沙棋牌在线 > 必赢棋牌官网 > SparkSQL大数据实战:揭开Join的神秘面纱

SparkSQL大数据实战:揭开Join的神秘面纱

时间:2020-01-24 03:43

本文来自 网易云社区 。

数据可视化,特别是基于Web的数据可视化的时代已经到来了。类似JavaScript的可视化库如D3.js,Rapha?l,以及Paper.js,以及最新浏览器所支持的如Canvas和SVG,以及使得那些过去只能由计算机专家和专业设计人员开发的复杂的可视化变得越来越简单了。

生活在18世纪中国的太极宗师王宗岳这样描述自己的武学心得:“动急则急应,动缓则缓随。”而随后19世纪的武式太极始祖武禹襄则在王宗岳的基础上概括出这样一句话,具有典型的中国式的玄妙深意一一以静制静,以动制动占先机。
我领悟到“以动制动占先机”这句话其实是有关“意念”——从最初读懂到最终操纵意念。
这种心理的交锋几乎是所有高水平交手过程的核心——这里我指的是广义的“交手”,比如一个汽车推销员和他的目标客户之间就可以称为“对手”的过招。当两个头脑训练有素的人在任何场合中针锋相对,双方就将比拼谁能掌控对方的思维。

 

必赢棋牌官网 1

Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景。

揭开数据可视化的神秘面纱

Join背景介绍

Join是数据库查询永远绕不开的话题,传统查询SQL技术总体可以分为简单操作(过滤操作-where、排序操作-limit等),聚合操作-groupby以及Join操作等。其中Join操作是最复杂、代价最大的操作类型,也是OLAP场景中使用相对较多的操作。因此很有必要对其进行深入研究。

 

另外,从业务层面来讲,用户在数仓建设的时候也会涉及Join使用的问题。通常情况下,数据仓库中的表一般会分为“低层次表”和“高层次表”。

 

所谓“低层次表”,就是数据源导入数仓之后直接生成的表,单表列值较少,一般可以明显归为维度表或事实表,表和表之间大多存在外健依赖,所以查询起来会遇到大量Join运算,查询效率很差。而“高层次表”是在“低层次表”的基础上加工转换而来,通常做法是使用SQL语句将需要Join的表预先进行合并形成“宽表”,在宽表上的查询不需要执行大量Join,效率很高。但宽表缺点是数据会有大量冗余,且相对生成较滞后,查询结果可能并不及时。

 

为了获得时效性更高的查询结果,大多数场景都需要进行复杂的Join操作。Join操作之所以复杂,主要是通常情况下其时间空间复杂度高,且有很多算法,在不同场景下需要选择特定算法才能获得最好的优化效果。本文将介绍SparkSQL所支持的几种常见的Join算法及其适用场景。

数据可视化如今成为了很多网站项目的必备功能。而类似于Platfora,DatameerClearStoryData以及Chartio等初创公司则可以利用基于浏览器的分析平台融到数百万美元的投资。

Join常见分类以及基本实现机制

当前SparkSQL支持三种Join算法:shuffle hash join、broadcast hash join以及sort merge join。其中前两者归根到底都属于hash join,只不过在hash join之前需要先shuffle还是先broadcast。其实,hash join算法来自于传统数据库,而shuffle和broadcast是大数据的皮(分布式),两者一结合就成了大数据的算法了。因此可以说,大数据的根就是传统数据库。既然hash join是“内核”,那就刨出来看看,看完把“皮”再分析一下。

数据可视化是数据探索以及数据表现的重要方式,然而,对于数据可视化的开发者来说,依然有很多挑战要去面对。这些迎接这些挑战的方法,则是很多专业的数据可视化开发者不愿意让别人知道的秘密,今天纽带线CRM系统小编为大家揭开数据可视化的神秘面纱 ,让数据可视化工具更高效。

必赢棋牌官网,hash join

先来看看这样一条SQL语句:select * from order,item where item.id = order.i_id,很简单一个Join节点,参与join的两张表是item和order,join key分别是item.id以及order.i_id。现在假设这个Join采用的是hash join算法,整个过程会经历三步:

  1. 确定Build Table以及Probe Table:这个概念比较重要,Build Table使用join key构建Hash Table,而Probe Table使用join key进行探测,探测成功就可以join在一起。通常情况下,小表会作为Build Table,大表作为Probe Table。此事例中item为Build Table,order为Probe Table。
  2. 构建Hash Table:依次读取Build Table(item)的数据,对于每一行数据根据join key(item.id)进行hash,hash到对应的Bucket,生成hash table中的一条记录。数据缓存在内存中,如果内存放不下需要dump到外存。
  3. 探测:再依次扫描Probe Table(order)的数据,使用相同的hash函数映射Hash Table中的记录,映射成功之后再检查join条件(item.id = order.i_id),如果匹配成功就可以将两者join在一起。

必赢棋牌官网 2

 

基本流程可以参考上图,这里有两个小问题需要关注:

  1. hash join性能如何?很显然,hash join基本都只扫描两表一次,可以认为o(a+b),较之最极端的笛卡尔集运算a*b,不知甩了多少条街。
  2. 为什么Build Table选择小表?道理很简单,因为构建的Hash Table最好能全部加载在内存,效率最高;这也决定了hash join算法只适合至少一个小表的join场景,对于两个大表的join场景并不适用。

上文说过,hash join是传统数据库中的单机join算法,在分布式环境下需要经过一定的分布式改造,就是尽可能利用分布式计算资源进行并行化计算,提高总体效率。hash join分布式改造一般有两种经典方案:

  1. broadcast hash join:将其中一张小表广播分发到另一张大表所在的分区节点上,分别并发地与其上的分区记录进行hash join。broadcast适用于小表很小,可以直接广播的场景。
  2. shuffler hash join:一旦小表数据量较大,此时就不再适合进行广播分发。这种情况下,可以根据join key相同必然分区相同的原理,将两张表分别按照join key进行重新组织分区,这样就可以将join分而治之,划分为很多小join,充分利用集群资源并行化。

下面分别进行详细讲解。

秘密一:现实中的数据往往很丑

broadcast hash join

如下图所示,broadcast hash join可以分为两步:

  1. broadcast阶段:将小表广播分发到大表所在的所有主机。广播算法可以有很多,最简单的是先发给driver,driver再统一分发给所有executor;要不就是基于BitTorrent的TorrentBroadcast。
  2. hash join阶段:在每个executor上执行单机版hash join,小表映射,大表试探。

必赢棋牌官网 3

        3.SparkSQL规定broadcast hash join执行的基本条件为被广播小表必须小于参数spark.sql.autoBroadcastJoinThreshold,默认为10M。

大部分的数据可视化的教程,都会让你轻松地从一个原始数据集开始。无论你是学习基本的柱状图还是力导向的网络图,你的数据都是干净的,经过整理的数据。这些完美的JSON或者CSV文件就像电视里的厨艺节目中的灶台那样干净整洁。而实际上,当你在处理现实中的真正的数据是,你80%的时间得用来搜寻,获取,载入,清洗以及转换你的数据。

shuffle hash join

在大数据条件下如果一张表很小,执行join操作最优的选择无疑是broadcast hash join,效率最高。但是一旦小表数据量增大,广播所需内存、带宽等资源必然就会太大,broadcast hash join就不再是最优方案。此时可以按照join key进行分区,根据key相同必然分区相同的原理,就可以将大表join分而治之,划分为很多小表的join,充分利用集群资源并行化。如下图所示,shuffle hash join也可以分为两步:

  1. shuffle阶段:分别将两个表按照join key进行分区,将相同join key的记录重分布到同一节点,两张表的数据会被重分布到集群中所有节点。这个过程称为shuffle。
  2. hash join阶段:每个分区节点上的数据单独执行单机hash join算法。

必赢棋牌官网 4

 

看到这里,可以初步总结出来如果两张小表join可以直接使用单机版hash join;如果一张大表join一张极小表,可以选择broadcast hash join算法;而如果是一张大表join一张小表,则可以选择shuffle hash join算法;那如果是两张大表进行join呢?

这样的过程,有时候可以用自动化的工具来完成。不过,差不多任何需要针对两个以上的数据集进行清洗的工作总会需要或多或少的人工的工作。有很多工具能够把XLS文件转化为XML的格式或者把时间戳转换为其他日期格式。但是,要想把一个公司的内部使用的销售类型与竞争对手进行比对,或者对输入错误进行检查,或者对不同的Encoding或者OCR产生出来的文字进行检查时,就只能靠手工来处理了。

sort merge join

SparkSQL对两张大表join采用了全新的算法-sort-merge join,如下图所示,整个过程分为三个步骤:

必赢棋牌官网 5

 

  1. shuffle阶段:将两张大表根据join key进行重新分区,两张表数据会分布到整个集群,以便分布式并行处理。
  2. sort阶段:对单个分区节点的两表数据,分别进行排序。
  3. merge阶段:对排好序的两张分区表数据执行join操作。join操作很简单,分别遍历两个有序序列,碰到相同join key就merge输出,否则取更小一边。如下图所示:

必赢棋牌官网 6

 

经过上文的分析,很明显可以得出来这几种Join的代价关系:cost(broadcast hash join) < cost(shuffle hash join) < cost(sort merge join),数据仓库设计时最好避免大表与大表的join查询,SparkSQL也可以根据内存资源、带宽资源适量将参数spark.sql.autoBroadcastJoinThreshold调大,让更多join实际执行为broadcast hash join。

工具及处理方式:

总结

Join操作是数据库和大数据计算中的高级特性,因为其独特的复杂性,很少有同学能够讲清楚其中的原理。本文试图带大家真正走进Join的世界,了解常用的几种Join算法以及各自的适用场景。后面两篇文章将会在此基础上不断深入Join内部,一点一点地揭开它的面纱,敬请关注!

 

本文已由作者范欣欣授权网易云社区发布,原文链接:SparkSQL大数据实战:揭开Join的神秘面纱

1)在数据可视化项目中给数据清洗留出足够的时间,特别是在需要处理多个数据源,需要手工录入或者OCR数据,进行不同类别的配比,或者需要处理一些非标准格式时,需要留出更多的时间。

2)GoogleRefine(需要翻围墙)是一个很好的数据清洗工具,尽管在有些地方,特别是处理非表格化数据时有些不足。此外,还有一些数据清洗专用的工具如DataWranger和Mr.DataConverter。不过,很多的数据清洗工作仍然需要你熟悉脚本语言如Python或者需要你在Excel里进行一些手工工作。记得把你的脚本存档,你以后肯定用得上。

3)用简单的一些散点图或者直方图来发现一些超正常范围的错误数据。

秘密二:柱状图往往更好

和柱状图比起来,气泡图可以在同样的空间表现更多地数据,饼图可以更清晰地表现整体和局部的关系,树状图能够更好地表现分层的结构。然而,这些图在简单明了方面都无法与柱状图相比。

在考虑数据可视化设计方案时,我们要问自己的第一个问题就是:“这个方案比柱状图好吗?”如果你需要在一个单一维度上可视化一个可量化的数据集,那么很少有别的方式能比得上柱状图。类似的,时间序列最好表现为线状图,而散点图一般用来表现两个线性度量的相关性。在数据可视化设计中,使用这些从18世纪以来就一直在使用的图风险最低。而柱状图对于进行数据比较的可视化来说是最佳方式。因为我们人眼最习惯的比较方式就是将两个东西并排比较。

关于柱状图优先,其实揭示了数据可视化中一个最大的秘密,那就是,那些最酷的可视化往往用处反而最小。最求新奇以及美观的可视化往往带来一个问题,那就是数据的可理解问题。很多柱状图的替代图迫使人们用他们并不擅长的方式进行比较,如比较面积,角度,色彩,或者透明度等。这些比较,说好听的,是增加了比较的难度,说的严重一些,可能会对数据进行扭曲,导致使用者得出错误的结论。

工具及处理方式:

1)不要轻易抛弃那些传统的可视化方式,如果这些方式能够表现你的数据。先试试柱状图或者线状图,如果你的数据真的需要其他的再考虑其他图。