• Fendora范东_
    2021-03-31
    请问磊哥,spark里面nested loop join和cartesian product jion有什么区别?

    作者回复: nlj是一种join实现方式哈,和hash join、sort merge join一样,是一种join实现机制。cartesian join是一种join形式,和inner、left、right对等。每一种join形式,都可以用多种实现机制来做、来实现~

    共 4 条评论
    18
  • Will
    2021-03-15
    第二个例子,可以利用map join,让小数据分发到每个worker上,这样不用shuffle数据

    作者回复: 没错,Broadcast joins可以进一步提升性能。

    共 5 条评论
    17
  • aof
    2021-05-01
    1. 其实有很多,比如用foreach算子将数据写入到外部数据库,导致每条数据的写入都会建立连接,另外单条写入也比批量写入的性能差很多。建议使用foreachPartition(),每个分区建立一个连接,同时可以批量写入,性能会好很多。 2. 一般来讲,小表与大表的关联操作,首先要考虑Broadcast Join 另外,关于Nested Loop Join的原理:https://www.geeksforgeeks.org/join-algorithms-in-database/amp/

    作者回复: 赞👍,满分💯,无可挑剔~

    共 2 条评论
    12
  • TaoInsight
    2021-03-17
    如果pai rDF的startDate和endDate范围有限,可以把日期范围展开,将非等值join转成等值join

    作者回复: 这块能展开说说吗?具体怎么转化为等值join?可以举个例子哈~

    共 6 条评论
    10
  • 慢慢卢
    2021-06-17
    老师,我把第二个例子自己试了一遍,有个问题不理解:两个df都只有一条数据,sparkui上第二个stage有200个task,为什么shuffle之后的stage的task有200个,虽然说shuffle之后reduce默认并行度是200,但我只有一条数据,实际上只需要一个task啊,其他的task是怎么产生的?

    作者回复: 空task~ 其实这个好理解,比如你对原始数据集做过滤,原来的数据有1万条,过滤之后1条,但是filter会继承之前的partitioner,也就是分区和之前是一样的,但其实很多分区中都没有数据,也就是空task。你这个例子也一样,并行度是200,实际上就是reducer的partitioner会划分出200的分区,partitioner是固定的,分区是一定要划出来的,但是实际上数据只有一条,其他的都是空task,白白浪费调度资源。 这也是为什么Coalesce之后,要做filter,以及为什么AQE要做自动分区合并,道理其实都一样,都是为了避免空task白白浪费宝贵的CPU资源。

    共 3 条评论
    5
  • Elon
    2021-03-22
    函数式的副作用指的是不修改入参吧?在函数内部是可以定义变量、修改变量的。因此fields变量在函数内部,应该不算副作用吧?

    作者回复: 是的,你说的没错。函数的副作用指的是对外部变量、外部环境的影响,内部状态的改变和转换不算。文中这块表述的不严谨哈,这里主要是想强调可变变量fields带来的计算开销。

    
    4
  • 葛聂
    2021-03-16
    Case 1为什么性能差一倍呢

    作者回复: 好问题,其实改动非常小,开销相比正例也不大,但这里的关键在于,这个函数会被反反复复调用上百次,累积下来,开销就上去了。所以,关键不在于点小不小,而是这个点,是不是瓶颈。

    共 3 条评论
    4
  • fsc2016
    2021-03-18
    请问老师,这个课程需要哪些基础,我平时使用过pysaprk 做过一些机器学习相关数据处理练习,对于我这种使用spark不多的,可以消化吸收嘛

    作者回复: 可以,没问题,接触过Spark就行。放心吧,原理部分会有大量的生活化类比和故事,尽可能地让你“边玩边学”。另外,咱们有微信群,有问题可以随时探讨~

    共 5 条评论
    3
  • 浩然
    2021-10-11
    简单啊。那个时间区间的,罗列出来,广播一下就完事了。从nest loop到hash join的跨越。 我之前做Oracle优化的,所以第一反应是哈希join,第二反应是不等值到等值。

    作者回复: 精辟!满分💯,一针见血

    
    2
  • 对方正在输入。。。
    2021-03-15
    可以先将pairdf collect到driver,再将数组按照startdate排序,然后再将其广播。然后在factdf.map里面实现一个方法来从广播的数组里面二分查找到eventdate所属的时间对子。最后就可以根据这个时间对子以及其他的维度属性进行分组聚合了

    作者回复: 广播的思路很赞。不过二分查找这里值得商榷哈,咱们目的是过滤出满足条件的event date,然后和其他维度一起、分组聚合。这里关键不在于过滤和查找效率,关键在于大表的重复扫描,只要解决这个核心痛点,性能问题就迎刃而解。

    共 2 条评论
    2