精华内容
下载资源
问答
  • 资源名称:经典表关联与多表查询资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • 新项目重构,由于数据量太大,采用了mysql存主和hbase存记录的方式现有一个需求,分别按老师,班级,校区的维度查询学员的实操合格率,作业达标率,目前老师,班级,校区信息都在mysql,学员的做题记录在hbase,经过分析,按...

    新项目重构,由于数据量太大,采用了mysql存主表和hbase存记录表的方式

    现有一个需求,分别按老师,班级,校区的维度查询学员的实操合格率,作业达标率,目前老师,班级,校区信息都在mysql,学员的做题记录在hbase,经过分析,按时间先在mysql查询班级列表,每条记录包含该班的学员和计划做题的题目id,然后根据学员id和题目id去hbase里做统计查询,之后在使用java8的分组查出老师和校区维度的数据

    @Service

    public class JobStatServiceImpl implements JobStatService {

    @Autowired

    private ErrorHistoryMapper errorHistoryMapper;

    @Autowired

    private HBaseErrorHistoryMapper hBaseErrorHistoryMapper;

    @Autowired

    private CacheRedisService cacheRedisService;

    @Override

    public List getJobStatList(LocalDateTime beginDate, LocalDateTime endDate) {

    List jobStatList = errorHistoryMapper.getJobStatList(beginDate, endDate);

    if (jobStatList != null && !jobStatList.isEmpty()) {

    jobStatList.parallelStream().iterator().forEachRemaining(jobStatResult -> {

    List studentIds = strToList(jobStatResult.getStudentIds(), true);

    List sectionCodes = strToList(jobStatResult.getSectionCodes(), false);

    Map jobTrueCount = hBaseErrorHistoryMapper.getJobTrueCount(studentIds, sectionCodes);

    jobStatResult.setPlanNumber(getPlanNumber(jobStatResult.getSectionCodes()));//计划做题数

    jobStatResult.setDoneNumber(jobTrueCount.get("DONENUMBER"));//完成数

    jobStatResult.setTrueNumber(jobTrueCount.get("TRUENUMBER"));//正确数

    });//班级达标率

    System.err.println(JSON.toJSONString(jobStatList));

    Collection values = jobStatList.parallelStream().filter(Objects::nonNull)

    .collect(Collectors.groupingBy(JobStatResult::getTeacherId,

    Collectors.reducing(new JobStatResult(), (obj1, obj2) -> {

    JobStatResult jobStatResult = new JobStatResult();

    BeanUtils.copyProperties(obj2, jobStatResult);

    jobStatResult.setPlanNumber(obj1.getPlanNumber() + obj2.getPlanNumber());

    jobStatResult.setDoneNumber(obj1.getDoneNumber() + obj2.getDoneNumber());

    jobStatResult.setTrueNumber(obj1.getTrueNumber() + obj2.getTrueNumber());

    return jobStatResult;

    }))).values(); //老师达标率

    System.err.println(JSON.toJSONString(collect));

    Collection values = jobStatList.parallelStream().collect(Collectors.groupingBy(JobStatResult::getSchoolCode,

    Collectors.reducing(new JobStatResult(), (obj1, obj2) -> {

    obj1.setPlanNumber(obj1.getPlanNumber() + obj2.getPlanNumber());

    obj1.setDoneNumber(obj1.getDoneNumber() + obj2.getDoneNumber());

    obj1.setTrueNumber(obj1.getTrueNumber() + obj2.getTrueNumber());

    return obj1;

    }))).values();//校区达标率

    System.err.println(JSON.toJSONString(values));

    }

    return jobStatList;

    }

    /**

    * 计划做题数

    * @param str

    * @return

    */

    private Long getPlanNumber(String str) {

    AtomicLong planNumber = new AtomicLong(0);

    if (str == null || str.isEmpty()) {

    return planNumber.get();

    }

    String[] split = str.split(",");

    Arrays.asList(split).parallelStream().filter(s -> {

    if (s == null || s.isEmpty())

    return false;

    return true;

    }).forEach(s -> {

    Long chapterPlanNumber = cacheRedisService.getChapterPlanNumber(s);

    planNumber.addAndGet(chapterPlanNumber);

    });

    return planNumber.get();

    }

    /**

    * str转list

    * @param str

    * @param f

    * @return

    */

    private List strToList(String str, boolean f) {

    List list = f ? new ArrayList(){{add(0);}} : new ArrayList(){{add("kckm");}}; //随意设个值,防止为空报错

    if (str == null || str.isEmpty()) {

    return list;

    }

    String[] split = str.split(",");

    if (f) {

    List collect = Arrays.stream(split).filter(s -> {

    if (s == null || s.isEmpty())

    return false;

    return true;

    }).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());

    list.addAll(collect);

    } else {

    List collect = Arrays.stream(split).filter(s -> {

    if (s == null || s.isEmpty())

    return false;

    return true;

    }).collect(Collectors.toList());

    list.addAll(collect);

    }

    return list;

    }

    }

    使用Collectors.groupingBy按字段分组,然后使用Collectors.reducing进行合并,这里的java8的mapReduce和hadoop的mapReduce都是一种编程模型,map(映射)reduce(规约),我这里用的是list.parallelStream(),内部会自己创建多线程跑你自定义的任务()好像是用的jdk7的forkjoin框架),所以需要注意线程安全问题,我这里统计计划做题数的时候定义了一个AtomicLong原子类,可以保证多线程环境下累加的数据正确性

    建议,hbase不支持事务,mysql+hbase不能保证数据一致性,最好hbase存一些比较久远的数据,新进的数据还是放mysql,这样关系型数据库也方便操作

    展开全文
  • 如果数据库的性能无限强大,多个的join肯定是需要的,尤其是复杂的分析型(OLAP)查询,甚至可能涉及10几个的join,但现实是部分数据库的性能都弱了,尤其是涉及到多join的查询。 规范一看就是在使用MySQL...
    展开全文
  • 2)数据预处理:数据做一下预处理,尽量保证join的时候,同一个key对应的记录不要有多。 3) 增加reduce个数:如果数据中出现了多个key,增加reduce个数,可以让这些key落到同一个reduce的概率小很多。 4) 转换...

    1) 过滤掉脏数据:

    如果大key是无意义的脏数据,直接过滤掉。本场景中大key无实际意义,为非常脏数据,直接过滤掉。

    2)数据预处理:

    数据做一下预处理,尽量保证join的时候,同一个key对应的记录不要有太多。

    3) 增加reduce个数:

    如果数据中出现了多个大key,增加reduce个数,可以让这些大key落到同一个reduce的概率小很多。

    4) 转换为mapjoin:

    如果两个表join的时候,一个表为小表,可以用mapjoin做。

    5) 大key单独处理:

    将大key和其他key分开处理

    6)hive.optimize.skewjoin:

    会将一个join sql 分为两个job。另外可以同时设置下hive.skewjoin.key,默认为10000。参考:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

    参数对full outer join无效。

    7)调整内存设置:

    适用于那些由于内存超限内务被kill掉的场景。通过加大内存起码能让任务跑起来,不至于被杀掉。该参数不一定会明显降低任务执行时间。如:

    setmapreduce.reduce.memory.mb=5120 ;
    
    setmapreduce.reduce.java.opts=-Xmx5000M -XX:MaxPermSize=128m ;

     

    展开全文
  • spark中大表关联hint和explain的使用 1. 问题背景: ...的语法去写dataframe的方式实现,但是这太大费周章了,于是找到了hint的方法 2. spark关联方式的知识(broadcast join、shuffle hash join和sort merg

    spark中大表关联小表hint和explain的使用

    1. 问题背景:

    在工作中中遇到个问题,那就是一个 大表A left join 一个很小的表 B
    查询速度总是很慢, 就想着怎么去优化,于是就查了些资料,得到可以通过
    设置 broadcastjoin的方式来优化,但是呢,这种方法很多都是使用scala
    的语法去写dataframe的方式实现,但是这太大费周章了,于是找到了hint的方法

    2. spark关联方式的知识(broadcast join、shuffle hash join和sort merge join)

    1. 小表对大表(broadcast join)

    将小表的数据分发到每个节点上,供大表使用。executor存储小表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在SparkSQL中称作Broadcast Join
    Broadcast Join的条件有以下几个:

    *被广播的表需要小于 spark.sql.autoBroadcastJoinThreshold 所配置的值,默认是10M (或者加了broadcast join的hint)

    *基表不能被广播,比如 left outer join 时,只能广播右表

    2. Shuffle Hash Join

    分为两步:

    对两张表分别按照join keys进行重分区,即shuffle,目的是为了让有相同join keys值的记录分到对应的分区中

    对对应分区中的数据进行join,此处先将小表分区构造为一张hash表,然后根据大表分区中记录的join keys值拿出来进行匹配

    3. 大表对大表(Sort Merge Join)

    将两张表按照join keys进行了重新shuffle,保证join keys值相同的记录会被分在相应的分区。分区后对每个分区内的数据进行排序,排序后再对相应的分区内的记录进行连接

    因为两个序列都是有序的,从头遍历,碰到key相同的就输出;如果不同,左边小就继续取左边,反之取右边

    3. explain的基础知识

    explain + select 语句

    执行即可查看 这个段查询的 执行计划,即 查询会按照什么样的方式执行

    4. 解决问题:

    1. 首先要确定这个大表A left join 小表B 现在使用的什么样的关联方式
    执行

    explain select * from A join B on A.id = b.id

    然后 查看执行计划,查看关键字是否有broadcast,如果有,那就不需要
    指定broadcast这种关联方式,再找其他优化方式,如果没有

    2. 那就 增加hint 指定broadcast的关联方式,具体方式为

    select + /*+ BROADCASTJOIN(B) */

    这里需要注意的点是 B如果是子查询的话,那么B就是这个子查询的别名

    3. 然后就是查询验证,完成了优化

    展开全文
  • 用了这么就得solr也知道了solr的适用性在哪,它不适合于异常复杂的数据组合,就比如是多对多的关系,适用于结构比较简单,或者说查询的数据结构比较简单,而数据量特别的特别的,检索的条件也是非常的多...
  • 简化模型如下: [code="sql"] select * from t,ut,u where t.tid = ut.tid ...(历史原因:任SB设计人员非要搞了一个中间ut,实际上在t中多搞一个uid的字段就好了,然后可以废除ut,但是修改模型的话代价太大了)
  • oracle之间的关联方式

    千次阅读 2012-06-14 08:42:44
    oracle之间的关联方式多之间的连接有三种方式...在嵌套循环中,内被外表驱动,外表返回的每一行都要在内中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小...
  • 需要导数据的场景,为了防止数据冗余,一般从一个的事实 查询出来的都是 维度的 id ,需要多次关联维度拿到维度的属性, 字段不多还好,如果查询的字段多就要多次关联维度,甚至可能存在多次关联同一个...
  • ORACLE多表查询优化 ORACLE多表查询优化 这里提供的是执行性能的优化,而不是后台数据库优化器资料: 参考数据库开发性能方面的各种问题,收集了一些优化方案统计如下(当然,象索引等优化方案过简单就不列入了,嘿嘿: ...
  • SQL查询--自关联

    2019-08-31 20:51:44
    存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新,或者将来还要存镇信息,都增加新的开销太大。 答案 定义areas,结构如下 id atitle pid 说明 因为省没有所属的省份,...
  • jdbc多表查询

    2020-03-25 19:10:59
    的原因 ...外键可以将两个进行连接,但不建议使用多,能不使用就不要使用,外键关联的主不能进行删除 。 在数据库中多表查询比较简单例如:select A.name,B.name,C.name from A,B,C where A.ai...
  • 1、两张数据量(千万级)关联表需要使用flink抽取; 2、在source中写关联SQL查询慢,心跳超时; 3、双流关联只是时间窗口关联。 提问:有没有什么好的方法可以用flink处理数据库双表全量关联数据抽取。 ...
  • 新项目重构,由于数据量太大,采用了mysql存主和hbase存记录的方式 (使用的phoenix操作hbase,通过mybatis多数据源连接mysql和phoenix,具体实现移步https://blog.csdn.net/qq_31349087/article/details/88535387) ...
  • MongoDB $lookup联表查询

    千次阅读 2019-02-13 11:22:06
    入手MongoDB第一天,发现跟关系型数据库差别也不算太大。比较有意思的是$lookup联表查询。 自己总结了一下,比较土,但是易于理解。(好多资料都是直接复制官方文档原话。) {$lookup: { from:'products', //...
  • 在整合两个数据时,要把B的一个字段整合到A中来,B有A的主键的外键。有两种方法(目标TableA,来源TableB):1、通过程序(通过php实现),分两步实现 ...ps:若数据量太大,有可能会出现运行超...
  • 原因耦合度高如果两张数据处于不同的数据库中,那么它们在开始的时候就在不同的子系统中,也就是说在设计过程中没有很强的关联关系,在一句sql中进行关联,不符合分而治之的思想。效率问题如果两个数据库在同一...
  • 数据量小的时候可以使用子查询做两表关联操作;但数据量的时候子查询效率低(因为是单条比对) 比如: update person1 p1 set p1.p_name=(select p_name from person2 where p1.p_id=p2.p_id) where p1.add_date...
  • 涉及到多表关联查询数据量很的情况下做个总结 1.可以用hibernate做更新的删除,然后用jdbc做查询和sql的优化或者是直接使用hibernate的 createsqlquery(hibernate的缓存机制本人用的并不是多) 2.如果条件...
  • 昨晚跑了一个程序:批量删除一些数据,我sql语句写的有点烂,在where条件时候用的是 IN 。所以最后发生异常:查询处理器用尽了内部资源,无法...这个时候应该优化sql语句,如果我们做的是表关联查询,可能因为表太
  • v2.0多变化,所以还不敢用。下面是v1.0的。 花了好长时间试验,才得到了自己想要的结果。 一直想用gorm查询到嵌套结构体,可惜自定义嵌套结构体好像不支持?下次按这个思路再试试,可能也行哦。 用join查询虽然...
  • 由于最近要从2个大表中A(几万条),B(几百万条记录)中查询其中的交集部分,用关联字段的关联查询慢,总结出另一个可以解决办法的比较高效语句,特拿来与大家分享,不多说了,下边详细介绍一下我的思路(我的...
  • 可能是 laravel 中的 eloquent 模型查询用的实在爽,感觉自己都不会写 sql 语句了????????。现在回想自己的 sql 技术的顶峰应该就是大学的课堂了,老师带着大家建表,学生、班级、成绩想想还有点记忆尤新...
  • 关于SQL的连接查询

    2016-09-25 22:19:29
    在sql语句中left join 的语法,select 字段 from a left...基本使用环境:做关联不能太大,如果可以左放数据少的,不要关联太多的,在关联很多时返回值字段能做到精简就精简 查询原理:先将左数据
  • 需求:关联查询另一个大数据的某些(一个以上)字段方案:因关联查询数据太大。多查询影响效率,单个子查询又有些多余。所以采用多列拼接子查询,然后根据SUBSTRING_INDEX(SOURCE,SEPARETOR,INDEX+1)。原理:...
  • 文章目录SQL性能下降的原因找出慢SQL语句:慢查询日志MySQL优化几步骤...关联查询太多join(设计缺陷或不得已的需求) 数据库服务器调优及各个参数设置不适当(缓冲、线程数等) 找出慢SQL语句:慢查询日志 MySQL
  • Postgres分区

    2021-04-23 10:56:37
    最近公司存储业务数据遇到了数据量过的问题,对于单个数据而言,性能点也就在千万级,查询起来在10s以上了,又不方便建索引(查询条件复杂了),然后就想到了分区,于是开始了我的实验之旅(写这段话的目的...
  • 文章目录聚合函数aggregate分组聚合函数annotate子查询关联查询表结构目的备注1备注2 前面几节课,是单查询及一些应用,但有时候会用到更复杂的嵌套查询,我前几年用原生的sql语句写的特别累,复杂了,还是学学...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 283
精华内容 113
关键字:

表太大关联查询