Top N 问题(MR,Hive,Mysql)

Hive SQL与关系型SQL核心差异:从数据模型到执行引擎的深度解析 SQL作为结构化查询语言,是数据操作与分析的基础。其核心原理在于通过声明式语法描述数据操作逻辑,由底层引擎负责解析与执行。在传统关系型数据库中,SQL引擎针对OLTP场景优化,强调事务一致性与低延迟。而在大数据领域,SQL技术价值体现在能够对海量数据进行高效批处理与分析,这催生了以Hive为代表的大数据查询引擎。Hive通过将类SQL的HiveQL语句翻译成MapReduce、Tez或Spark等分布式计算任务,实现了在Hadoop生态中对PB级数据的处理能力。其应用场景广泛覆盖数据仓库建设、ETL流程及商 阅读详情

前言:

仅仅针对权威指南的吐槽,可跳过。说到这个问题实在是让人崩溃,开始看hadoop权威指南中文第四版中的9.2.4案例,求每年的最高温,要求年份按照升序,温度降序。针对组合键告诉我自定义分区只能保证每一个 reduce 接受一个年份的所有记录,而在一个分区之内,reduce 仍是通过建进行分组的分区,所以应该自定义分组。但是自定义分组前后结果配图竟然完全一样!?这是什么迷惑行为。此外,针对分区分组之后reduce 方法中直接使用context.write(key,NullWriteable.get())就能输出最高温度,感到奇怪。

MR代码实现:

1.定义自然键和自然值的组合键,该类必须实现WriteableComparable。

import java.io.*;

import org.apache.hadoop.io.*;

public class IntPair implements WritableComparable<IntPair> {

  private int first;
  private int second;
  
  public IntPair() {
  }
  
  public IntPair(int first, int second) {
    set(first, second);
  }
  
  public void set(int first, int second) {
    this.first = first;
    this.second = second;
  }
  
  public int getFirst() {
    return first;
  }

  public int getSecond() {
    return second;
  }

  @Override
  public void write(DataOutput out) throws IOException {
    out.writeInt(first);
    out.writeInt(second);
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    first = in.readInt();
    second = in.readInt();
  }
  
  @Override
  public int hashCode() {
    return first * 163 + second;
  }
  
  @Override
  public boolean equals(Object o) {
    if (o instanceof IntPair) {
      IntPair ip = (IntPair) o;
      return first == ip.first && second == ip.second;
    }
    return false;
  }

  @Override
  public String toString() {
    return first + "\t" + second;
  }
  
  @Override
  public int compareTo(IntPair ip) {
    int cmp = compare(first, ip.first);
    if (cmp != 0) {
      return cmp;
    }
    return compare(second, ip.second);
  }
  
  /**
   * Convenience method for comparing two ints.
   */
  public static int compare(int a, int b) {
    return (a < b ? -1 : (a == b ? 0 : 1));
  }
  
}
import java.io.IOException;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

// vv MaxTemperatureUsingSecondarySort
public class MaxTemperatureUsingSecondarySort
  extends Configured implements Tool {
  
  static class MaxTemperatureMapper
    extends Mapper<LongWritable, Text, IntPair, NullWritable> {
  
    private NcdcRecordParser parser = new NcdcRecordParser();
    
    @Override
    protected void map(LongWritable key, Text value,
        Context context) throws IOException, InterruptedException {
      
      parser.parse(value);
      if (parser.isValidTemperature()) {
        /*[*/context.write(new IntPair(parser.getYearInt(),
            parser.getAirTemperature()), NullWritable.get());/*]*/
      }
    }
  }

  
  static class MaxTemperatureReducer
    extends Reducer<IntPair, NullWritable, IntPair, NullWritable> {
  
    @Override
    protected void reduce(IntPair key, Iterable<NullWritable> values,
        Context context) throws IOException, InterruptedException {
      
      /*[*/context.write(key, NullWritable.get());/*]*/
    }
  }
  
  public static class FirstPartitioner
    extends Partitioner<IntPair, NullWritable> {

    @Override
    public int getPartition(IntPair key, NullWritable value, int numPartitions) {
      // multiply by 127 to perform some mixing
      return Math.abs(key.getFirst() * 127) % numPartitions;
    }
  }
  
  public static class KeyComparator extends WritableComparator {
    protected KeyComparator() {
      super(IntPair.class, true);
    }
    @Override
    public int compare(WritableComparable w1, WritableComparable w2) {
      IntPair ip1 = (IntPair) w1;
      IntPair ip2 = (IntPair) w2;
      int cmp = IntPair.compare(ip1.getFirst(), ip2.getFirst());
      if (cmp != 0) {
        return cmp;
      }
      return -IntPair.compare(ip1.getSecond(), ip2.getSecond()); //reverse
    }
  }
  
  public static class GroupComparator extends WritableComparator {
    protected GroupComparator() {
      super(IntPair.class, true);
    }
    @Override
    public int compare(WritableComparable w1, WritableComparable w2) {
      IntPair ip1 = (IntPair) w1;
      IntPair ip2 = (IntPair) w2;
      return IntPair.compare(ip1.getFirst(), ip2.getFirst());
    }
  }

  @Override
  public int run(String[] args) throws Exception {
    Job job = JobBuilder.parseInputAndOutput(this, getConf(), args);
    if (job == null) {
      return -1;
    }
    
    job.setMapperClass(MaxTemperatureMapper.class);
    /*[*/job.setPartitionerClass(FirstPartitioner.class);/*]*/
    /*[*/job.setSortComparatorClass(KeyComparator.class);/*]*/
    /*[*/job.setGroupingComparatorClass(GroupComparator.class);/*]*/
    job.setReducerClass(MaxTemperatureReducer.class);
    job.setOutputKeyClass(IntPair.class);
    job.setOutputValueClass(NullWritable.class);
    
    return job.waitForCompletion(true) ? 0 : 1;
  }
  
  public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new MaxTemperatureUsingSecondarySort(), args);
    System.exit(exitCode);
  }
}
// ^^ MaxTemperatureUsingSecondarySort

流程:

1.TextInputFormat 会调用RecordReader 一行行读取文本,以行号为键,文本内容为值。将一个个<LongWritable,Text>通过map转换为<IntPair,NullWritable>,最终形成List<IntPair,NullWritable>

2.在mapper的最后,会先调用job.setPartitionerClass对这个List进行分区,每个分区映射到一个reducer。每个分区内又调用job.setSortComparatorClass设置的keyComparator(覆盖了IntPair中的定义),最终形成第一列升序,第二列降序

3.reducer 接受到所有映射到这个reducer的map输入后,调用job.setSortComparatorClass设置的keyComparator对所有数据对排序。经过排序,第一列值相同的IntPair会被放在一起。开始构造key对应得value迭代器,此时用到分组比较器,使用jobjob.setGroupingComparatorClass设置的分组函数类。

4.在reducer的context中(实际是ReducerContextImpl类)中GroupComparator会判断当前中间输入的key(本例是IntPair对象)是否和下一个key相同。如果比较器返回0(代表相同,非0代表不同),则reducer的run会一直在context的nextkey->nextkeyvalue方法中调用该比较器,直到比较器返回非0。而每次nextkeyvalue的调用,都会更新context的当前key->value对的值,然后在run中,调用reduce方法,传入context的当前key->value对。所以如本例中,中间输出中两列都是升序排列,则context会一直调用groupcomparator并更新当前key->value,直到非0时调用reduce方法传入当前key->value。(只要这个比较器比较的两个key相同,他们就属于同一个组)

5.进入Reducer的reduce方法,reduce方法的输入是所有的key和它的value迭代器。

6.分区的目的是根据Key值决定Mapper的输出记录被送到哪一个Reducer上去处理,key 比较器决定了key的排序方式,group比较器决定了哪些数据可以被划分为一组,同时进入到一个reduce 方法。

7.key比较器还有一个重要功能,就是如果job没有设定group比较器,则key比较器将充当group比较器的角色(如果设置了key比较器的话),也即mapper过程和reducer过程都会用key比较器。

8.在实现比较器时,在构造函数中,一定要调用super(XXX.class,true),XXX是你用来比较的类的名称,true是表示生成该类对象(在比较器内部)。之后比较时,比较器会用输入数据的字节值进行反序列化来给内部XXX类对象赋值,之后该属性对象被传递到比较器的compareTo函数。如果没有以上步骤,运行时会抛出空指针异常。

9.回到原问题,为什么context.write(key,NullWriteable.get())就能输出最高温度?并不是分组到最后就能输出一个结果。在最后进入到reduce方法的结果为[1900,35],[1900,34],[1900,33]等key值以及空值迭代器。因为[1900,35]排列在第一个,而一组中context.write(key,NullWriteable.get())也只写了一次。

10.所以想要求出每组TOPK应该怎么做:

static class MaxTemperatureReducer
    extends Reducer<IntPair, NullWritable, IntPair, NullWritable> {
  
    @Override
    protected void reduce(IntPair key, Iterable<NullWritable> values,
        Context context) throws IOException, InterruptedException {
           int i=0;
           for(NullWritable  value:values){
             i++;
            if(i<=k)
              /*[*/context.write(key, NullWritable.get());/*]*/
            else 
                break;

         }
    }
  }

hive 实现top n

hive 中提供了具体的排序函数,所以总体实现是十分简单的。

row_number() over ([partition col1] [order by col2])

rank() over ([partition col1] [order by col2])

dense_rank() over ([partition col1] [order by col2])

它们都是根据col1字段分组,然后对col2字段进行排序,对排序后的每行生成一个行号,这个行号从1开始递增

col1、col2都可以是多个字段,用','分隔

区别:

1)row_number:不管col2字段的值是否相等,行号一直递增,比如:有两条记录的值相等,但一个是第一,一个是第二

2)rank:上下两条记录的col2相等时,记录的行号是一样的,但下一个col2值的行号递增N(N是重复的次数),比如:有两条并列第一,下一个是第三,没有第二

3)dense_rank:上下两条记录的col2相等时,下一个col2值的行号递增1,比如:有两条并列第一,下一个是第二

其中 row_number 还可以用between ... and ... 实现分页查询。

create table yt(
  year String,
  temperature int
)row format delimited fields terminated by '\t';


--求每年最高温前三
select * from (select *,row_number over(partition by year order by temperature desc) as tem from  yt)t where tem >=3;

--求1900年 35度的排名
select tem from (select * ,rank_number over(partition by year order by temperature desc) as tem from yt )t where year='1900' and temperature=35;

Mysql 分组求 top N

mysql 中的top n 问题实际上转化为当前记录中某列数据在所有记录中的排名,即如果存在N列数据比当前列数据大,那么当前数据的排名即为N+1(相同大小的排名相同)

数据准备:

DROP TABLE IF EXISTS `info`;
 CREATE TABLE `info`  (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
   `views` int(255) DEFAULT NULL,
   `info_type_id` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of info
-- ----------------------------
INSERT INTO `info` VALUES (1, '罗志祥黑眼圈', 10, 4);
INSERT INTO `info` VALUES (2, '新冠肺炎', 22, 4);
INSERT INTO `info` VALUES (3, '流浪地球电影大火', 188, 1);
INSERT INTO `info` VALUES (4, '葛优瘫', 99, 2);
INSERT INTO `info` VALUES (5, '周杰伦出新歌了', 877, 2);
INSERT INTO `info` VALUES (6, '蔡依林西安演唱会', 86, 1);
INSERT INTO `info` VALUES (7, '中纪委调盐', 67, 3);
INSERT INTO `info` VALUES (8, '人民大会堂', 109, 3);
INSERT INTO `info` VALUES (9, '重庆称为网红城市', 202, 1);
INSERT INTO `info` VALUES (10, '胡歌结婚了', 300, 2);
INSERT INTO `info` VALUES (11, 'ipone15马上上市', 678, 2);
INSERT INTO `info` VALUES (12, '中国探月成功', 54, 4);
INSERT INTO `info` VALUES (13, 'Trump演说家', 67, 4);
 
DROP TABLE IF EXISTS `info_type`;
CREATE TABLE `info_type`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- Records of info_type
-- ----------------------------
INSERT INTO `info_type` VALUES (1, '娱乐');
INSERT INTO `info_type` VALUES (2, '八卦');
INSERT INTO `info_type` VALUES (3, '政治');

需求:取热门的资讯信息列表且每个类别只取前3条

 SELECT t.* from (
        SELECT
             t1.*,
             (SELECT count(*) + 1 FROM info t2 WHERE t2.info_type_id = t1.info_type_id AND t2.views > t1.views ) top
         FROM
         info t1
     ) t where top <=3 order by t.info_type_id,top

参考链接 :

https://zhuanlan.zhihu.com/p/62404730

https://blog.youkuaiyun.com/xiaocaidexuexibiji/article/details/12125699

https://blog.youkuaiyun.com/Mr_Liuzhongbin/article/details/103087148?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-32&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-32

 

Hive实战:从海量搜索日志到业务洞察的完整数据流水线构建 在大数据领域,数据仓库是处理和分析海量非结构化数据的核心基础设施,其核心原理在于通过SQL-like的查询语言对分布式存储的数据进行高效计算。Hive作为构建在Hadoop之上的数据仓库工具,其技术价值在于将复杂的MapReduce编程简化为类SQL操作,极大提升了开发效率,降低了大数据处理门槛。在电商、内容推荐、用户行为分析等应用场景中,面对TB级的原始日志,通过Hive构建分层数仓(如ODS、DWD层)并进行ETL处理,是实现数据价值的关键路径。本文以**用户搜索日志分析**这一典型场景为例,深入剖析如 阅读详情

相关推荐

Sqoop数据迁移:核心架构、优化配置与实战技巧

数据迁移工具是构建数据仓库和数据分析平台的关键组件,其核心原理是通过高效的数据传输机制实现异构数据源之间的数据同步。Sqoop作为Hadoop生态系统中专为关系型数据库与HDFS之间数据传输设计的工具,采用MapReduce并行处理框架实现高性能数据迁移。在实际工程应用中,合理配置分片策略、类型映射规则以及性能参数,可以显著提升大数据环境下的数据导入导出效率。特别是在处理MySQL、Oracle等主流数据库与HDFS、Hive、HBase等大数据存储系统之间的ETL过程时,Sqoop的connector插件

优快云头条 697

hive中连续N天登录问题、topN问题、拉链表实现

hive中连续N天登录、topN问题、拉链表

weixin_44870066的博客 3730

【信息科学与工程学】【数据科学】第一百二十二篇 大数据产品中的函数与算法01

它通常指。下面按照你给出的表格列💡 说明:下表中的"产品"以开源/主流商业组件为具象载体(Hadoop、Spark、Flink、Kafka、Hive、HBase、Iceberg、Atlas、Ranger、TensorFlow 等),它们共同构成一个完整的大数据产品家族;代码为实现示例,用于说明算法在工程系统中的落地方式。

weixin_49199313的博客 199

Hive统计TopN问题

这里模拟一个统计每个区域最受关注的top3的产品业务需求,并模拟生成3张表,分别为城市表city_info,产品表product_info,用户点击行为表user_click。所用的工具有HDFS,HIVE,SQOOP,MYSQL。

qq_34382453的博客 3086

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不兼容问题

本文针对在国产麒麟系统上安装Kettle时遇到的aarch64架构不兼容问题,提供了详细的解决方案。通过剖析错误根源,指导用户获取并放置正确的SWT库文件,并修改启动脚本,成功解决“平台不支持”的报错,确保ETL工具在ARM架构的国产化环境中顺利运行。

weixin_29214691的博客 277

ESP32搭配LVGL显示图片的两种方法详解:内部存储 vs 外部文件

本文详细介绍了ESP32搭配LVGL显示图片的两种方法:内部存储与外部文件。内部存储方案适合快速响应的小图片,而外部文件方案则适用于需要灵活更新和大容量图片的场景。通过对比分析,帮助开发者根据项目需求选择最优方案,提升嵌入式系统的UI性能。

weixin_30399821的博客 519

hive中分区取TOPN

目录 0. 概述 1. 准备数据和表结构 2. 几种不同分组取TOPN情况说明 2.1 分组-组内排序 2.2 分区-组内排序-取topN 2.3 不分组-只对某个字段排序 2.4 rank() over() 的使用 2.5 dense_rank()的使用 3. 参考资料 0. 概述 hive中分组取topN,有3中类型的函数可以用: row_number() over (partition by col01 order by col02 desc ) rank() over (p

litlit023的专栏 1839

新建菜单Office被替换为腾讯文档 - 解决方案

右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。

NSJim的博客 2930

Hive的Rank函数

一、函数说明 RANK() 排序相同时会重复,总数不会变 DENSE_RANK() 排序相同时会重复,总数会减少 ROW_NUMBER() 会根据顺序计算 PERCENT_RANK:百分比排序 二、示例说明 示例表: (1)创建hive表并导入数据 create table score( name string, subject string, score int) row format delimited fields terminated by "\t"; load data local in

Markble 7937

保姆级教程:用ncnn把自训练的YOLOv8模型塞进Android App(附完整代码)

本文提供了一份详细的保姆级教程,指导开发者如何将自训练的YOLOv8模型通过ncnn框架部署到Android应用中。教程涵盖环境配置、模型训练与转换、Android工程集成及性能优化等全流程,并附完整代码实现,帮助开发者快速掌握移动端AI模型部署技术。

weixin_42659194的博客 255

热力学仿真软件:SimScale_(1).SimScale入门与基础操作

导航栏:位于页面顶部,包含项目管理、仿真设置、结果分析等主要功能。项目列表:展示用户创建的所有项目。工作区:用于进行具体的操作,如几何建模、网格划分、边界条件设置等。控制台:显示操作日志和仿真进度。网格划分是将几何模型离散化为一系列小单元的过程,这些单元用于求解热力学方程。SimScale提供了多种网格划分方法,包括结构化网格和非结构化网格。SimScale提供了丰富的API接口,用户可以通过编程语言进行二次开发,实现自动化仿真和结果分析。项目管理:创建、删除和管理项目。几何建模:创建、导入和修复几何模型。

kkchenjj的博客 1867

Hive的Rank排名(rank函数,dense_rank函数,row_numer函数)

首先三者都是产生一个自增序列,不同的是。dense_rank() 排序的字段值相同时序列号会重复且下一个序列号继续序号自增,如:1、2、2、3、4(出现两个2,继续按照3编号)rank() 排序的字段值相同时序列号会重复且下一个序列号跳过重复位,如:1、2、2、4、5(出现两个2,跳过序号3,继续编号4)row_number() 排序的字段值相同时序列号不会重复,如:1、2、(2)3、4、5(出现两个2,第二个2继续编号3)

2301_77257988的博客 1727

使用 Python 构建 Reddit 热帖爬虫:抓取热门讨论帖和评论

在现代互联网中,Reddit 被誉为全球最大、最活跃的讨论平台之一,汇聚了各种主题的帖子、评论和社交互动。因此,抓取 Reddit 上的热门帖子和评论可以为我们提供一个丰富的文本数据源,可以用于情感分析、话题建模、趋势分析等应用。Reddit 提供了官方的 API,可以让开发者获取包括帖子、评论、用户信息等在内的各种数据。我们可以结合上述方法,抓取多个热门帖子,并将每个帖子的标题、作者、发布时间和评论内容保存到一个数据结构中。每个帖子的对象包含了丰富的信息,如标题、内容、发布时间、作者等。

2201_76125261的博客 382

hive优化的总结

hive优化的全面总结

qq_44665283的博客 4654

Calibre :Standard Verification Rule Format(SVRF) Manual (1-2)

摘要:SVRF规则文件是用于Calibre和ICverify工具的脚本文件,包含层定义、规则检查、注释、预处理指令等元素。规则文件支持全局/局部层定义、隐式层操作,以及条件编译指令(#DEFINE/#IFDEF等)。宏功能(DMACRO/CMACRO)可实现代码复用,支持参数化层操作和嵌套调用。预处理指令支持版本控制(#IFDEFCALIBRE_VERSION)和环境变量默认值设置(#PRAGMAENV)。宏中的层名具有局部作用域,可通过特殊语法实现全局层名指定,LOCAL()修饰符可创建调用作用域内的唯一

u013620135的博客 1339

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1178

基于Sqoop+Hive+MySQL的离线数仓实战:网站日志分析项目全流程解析

ETL(抽取、转换、加载)是构建数据仓库的核心流程,它负责将分散的业务系统数据整合到统一的分析平台。其基本原理是通过抽取工具将数据从源系统(如MySQL)迁移到大数据存储(如HDFS),再经过转换清洗后加载到分析引擎(如Hive)中。这项技术的核心价值在于实现OLTP(在线事务处理)与OLAP(在线分析处理)的分离,将分析查询压力从生产数据库剥离,保障业务系统稳定性的同时,为海量数据分析提供可能。在典型的应用场景中,如网站日志分析、用户行为统计等T+1报表场景,稳定可靠的离线批处理架构依然是许多企业的首选。

weixin_33910137的博客 380

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划...

一、概念 1、介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存在:HDFS,分析的底层是MapReduce,程序运行在yarn上 2、优缺点 HQL快速开发、适用于数据分析等实时性不高的场景、支持自定义函数、擅长大数据 表达能力有限、效率低、延迟性高 3、架...

USTSD的博客 425

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大数据工程师必掌握的5大核心框架:Hadoop、Spark、Flink、Kafka、Hive

分布式数据处理是现代数据平台的基石,其本质是在海量、高吞吐、低延迟与强一致性等多重约束下实现可靠计算。Apache Hadoop提供高容错的分布式存储底座,Apache Spark以统一引擎支撑批流一体开发,Apache Flink凭借事件时间与状态管理保障毫秒级实时决策,Apache Kafka构建解耦、可重放的数据通信中枢,Apache Hive则通过元数据抽象弥合工程与分析的认知鸿沟。这五大框架共同构成从数据接入、存储、计算到查询的完整闭环,广泛应用于电商用户行为分析、金融风控、物联网设备管理等典型场

weixin_30902251的博客 440

sqoop从hdfs 中导出数据到mysql

bin/sqoop export \ --connect "jdbc:mysql://mini1:3306/study?useUnicode=true&amp;characterEncoding=utf-8"\ --username root \ --password root \ --table top_n_city \ --m 1 \ --export-dir /movie/t...

weixin_34352449的博客 156

Hadoop生态分层能力模型与生产级协同实践

Hadoop生态本质上是一套分层协作的分布式数据操作系统,其核心价值不在于工具堆砌,而在于按需补足存储增强、计算加速、查询交互和数据治理四层能力缺口。理解YARN资源调度、HDFS数据访问模式与ZooKeeper协调机制这三大物理连接点,是实现Hive、Spark、HBase等组件稳定协同的基础。尤其在实时分析、交互式查询与高并发在线服务等典型场景中,脱离分层逻辑的盲目选型极易导致资源浪费与SLA失控。本文聚焦真实生产环境中的能力断层识别、跨组件配置咬合及典型协同坑点,为构建可演进的大数据平台提供工程化路线

Coding 523

Hadoop+Spark招聘数据分析系统设计与实现

大数据处理技术已成为现代企业分析海量数据的核心工具,其中Hadoop生态和Spark框架因其分布式计算能力被广泛应用。通过MapReduce进行离线批处理,结合Spark Streaming实现实时计算,可以构建高效的Lambda架构。这类技术特别适用于招聘数据分析场景,能处理千万级职位信息并生成人才需求报告。系统采用Hive数据仓库管理结构化数据,配合协同过滤推荐算法实现个性化职位推荐。可视化大屏通过ECharts展示城市薪资热力图等关键指标,为求职者和企业提供直观决策支持。

weixin_30819085的博客 341

Elasticsearch terms aggregation 精确性陷阱与实战调优指南

terms aggregation 是 Elasticsearch 中最常用也最容易误用的聚合类型,其本质是分布式分片级局部采样而非全局精确统计。原理上依赖各分片独立选出 top-N 候选再合并,导致高基数字段下必然出现漏桶、排序失真和子聚合数据截断。技术价值在于平衡实时性与资源开销,但代价是结果存在可量化的误差边界。典型应用场景包括电商热销榜、用户行为 TOPN 分析、实时看板等,一旦用于财务核对或推荐信号则风险陡增。本文聚焦三个核心控制参数:shard_size 决定采样深度、doc_count_err

dieqiao8331的博客 355

2018蘑菇街校招大数据平台开发笔试题深度解析

在大数据开发岗位的求职中,扎实的编程基础与分布式系统理解是核心竞争力。这道2018年蘑菇街校招笔试题覆盖了Java并发、JVM、Hadoop生态、数据仓库建模等核心模块,深度考察候选人从原理到工程实践的综合能力。从MapReduce的Shuffle机制到Hive SQL优化,再到海量数据算法设计,每一类考点都指向日常工作中真实遇到的瓶颈与调优场景。本文结合试卷内容,拆解各知识点权重与复习优先级,并提供系统性的备考路线,帮助读者建立从理论到实战的完整知识框架,为应对大数据平台开发岗位的技术挑战打下坚实基础。

weixin_33836874的博客 564

现代化分析框架:工业级数据分层架构与可信指标实践

现代数据分析已从单点报表升级为支撑关键业务决策的工程化体系。其核心在于构建可审计、可追溯、可协同的数据分析框架,通过分层解耦(接入层、处理层、服务层、消费层)明确数据生产者、加工者与消费者的责任边界;依托dbt实现SQL优先、版本可控、测试驱动的数据建模,结合Trino联邦查询与ABAC动态权限治理,保障跨源、实时、安全的指标服务能力。该架构显著降低指标口径歧义、数据血缘不可溯、权限与语义错位等高频痛点,广泛适用于制造业停机预警、零售促销归因、金融风控迭代等强业务耦合场景,是企业从‘报表作坊’迈向‘分析中台

512
上一篇: 连接多对多问题
下一篇: hive 错误记录
date-date
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值