2022-06-09

动态数组ArrayList:底层是数组,动态扩容,数据查询非常快,但要求连续内存空间。
双向队列LinkedList:底层是链表,不需要连续内存空间,但是查询搜索效率极低。
键值对集合HashMap:底层是数组加链表,存放键值对,检索快,但由于键是按照hash值存储的,所以无序。
TreeMap:底层是优化了的排序二叉树(红黑树),物理实现,使用一个静态内部类Entry代表一个树节点,这是一个完全有序的结构,但是每个树节点都需要保存一个父节点引用,左右孩子节点引用,还有一个value值,效率高但开销大。
priorityQueue:折中。

ArrayList

1.底层是用数组实现的,重要的成员有,元素数组、数组中元素数size、modcount修改次数
2.进行add添加时,若没有指定添加位置,就会根据size确定添加的新元素在数组的下标中进行添加,若 size>=数组长度,要扩容。
3.在进行扩容时,会将modcount++,并且将原数组中的元素拷贝到新数组中,新数组的大小是原数组的1.5倍,默认初始容量是0,且在第一次添加元素时,设置数组大小为0.
4.若指定i为添加元素的位置,会调用System.ArrayCopy方法对i下标以后的元素进行拷贝,拷贝完成之后再把添加的元素放在i位置
5.调用get方法时,由于ArrayList底层基于数组,因此实现了一个RandomAccess标识接口,表示按下标读取数据速度很快,主要是由于数组在内存中是连续存储,可以通过第一个元素的存储地址和偏移量offset直接计算得到访问的元素存储地址
6.若contains方法是通过元素的值进行查找,则需要遍历数组。

LinkList

1.LinkList是基于链表存储的,链表中节点Node主要包含存储元素的引用,指向前驱节点指针prev和指向后继节点的指针next,LinkList中重要成员主要有size、头节点、尾节点。
2.LinkList由于Node在内存中是分散存储的,因此没有对size限制,在执行add方法时,默认添加在链表的尾部。
3.若添加指定元素在链表中的位置,LinkList需要调用node方法,传入参数Index找到对应的节点,在查找对应的节点时,若Index<size/2,从头节点向后遍历,若Index>size/2,从尾结点向前遍历,,因此即使添加元素只需要改变节点的指针,但查找添加的位置的耗时仍然不小,开销不比ArrayList少
4.调用get方法时,若按下标查找,也需要进行同样的遍历,性能比ArrayList差很多,按contains查找也需要进行遍历,与ArrayList半斤八两
5.链表节点除了元素值,还需要维护两个指针,导致LinkList存储开销比ArrayList大得多。

Vector&Stack

1、Vector也是基于数组进行存储,原理与ArrayList类似,区别在于,Vector中会维护一
个CapacityIncrement变量,每进行一次扩容,只增加一个变量的大小,若没有指定CapacityInc,默认为0,且在扩容时,若CapacityInc为0,则将数组大小翻倍。
2.Vector中的所有增删查改方法,都通过在方法上加Sychronized锁方式锁住Vector对象,实现线程安全,性能较差。

不可重复列表

1.HashSet:内部有一个成员变量的HashMap,实际上就是使用的HashMap方法
2.TreeSet:内部有一个成员变量的TreeMap,底层就是TreeMap
3.LinkedHashSet:底层调用的HashSet的方法,

Queue和Dequeue

LinkedList实现Queue和Deque,LinkedList中使用first和last来标记链表的头节点和尾结点,当进行add方法添加时,默认尾插,调用poll方法时,就会返回first节点,调用pop方法时,返回last节点。

ArrayDeque:

数组的方式实现了双端队列,主要是使用head和tail两个指针来标记队列头栈底和队列尾栈顶

PriorityQueue:保证每次取出的元素都是队列中权值最小的

1.使用数组的方式实现了优先队列,内部其实是一个二叉堆结构(小顶堆),原理与堆排序一致
2.重要属性有size,用来标记数组中元素个数,即新添加的元素的下标
3.执行offer操作时,先确认size是否大于等于数组长度,若大于等于则扩容,执行siftup方法
4.siftup方法中,若制定了comparator,按照comparator的compare方法与父节点比较,也就是(size-1>>>1),下标对应的元素进行堆的插入,若没有指定,按元素实现的comparable接口的compareTo方法进行比较。
5.执行poll()方法时,若size为0,返回空值,否则返回数组中下标为0的堆顶元素,将数组下标0位置替换为size-1位置的元素,并减小size,调用siftdown方法整理堆
6.siftdown方法同样也分为根据comparator和comparable两种比较,主要是对0位置新换上来的元素与子节点进行比较,将其与最大的并大于0位置的子节点进行交互,并循环直到将其放到合适的位置。

BlacQueue:阻塞队列
HashMap
重要成员变量

1.负载因子:默认为0.75,表示HashMap存储的元素数数达到HashMap散列数组长度的0.75时就进行扩容
2.散列数组:HashMap通过分离链表法解决哈希冲突的问题,在散列数组中存储的就是链表中的一个头节点

<think>好的,我现在需要分析用户提供的Hive SQL语句,并解释它的含义。用户给出的语句是: `load data inpath '/origin_data/gmall/log/topic_log/2022-06-08' into table ods_log_inc partition(dt='2022-06-09');` 首先,我需要拆解这条语句的各个部分,理解每个关键字的作用。用户可能对Hive的数据加载和分区机制不太熟悉,所以需要详细解释每个部分,并注意可能的常见疑问点,比如路径处理、分区的作用等。 首先,`LOAD DATA INPATH`是Hive中用于将数据从HDFS加载到表的命令。接下来是源路径`'/origin_data/gmall/log/topic_log/2022-06-08'`,这里需要注意Hive在处理路径时是否会将数据移动或复制,以及权限问题。然后是目标表`ods_log_inc`,需要确认该表是否存在,是否为分区表。`PARTITION (dt='2022-06-09')`部分说明数据将被加载到指定的分区中,这里的分区键是dt,值为2022-06-09。需要注意的是,如果分区不存在,Hive会自动创建,但用户可能需要预先存在该分区,具体取决于Hive配置。 接下来,我需要考虑用户可能的疑问点:为什么源路径是2022-06-08而分区是2022-06-09?可能是数据延迟到达,或者按处理日期分区。需要解释分区的作用,比如数据管理和查询优化。 另外,需要说明执行此命令后,HDFS上的源路径数据会被移动到表的目录下,原路径不再存在该数据,除非使用外部表。如果目标表是外部表,可能行为不同,但根据之前用户的问题历史,ods_log_inc可能是外部表,但语句中没有指定,可能需要一步确认。 还需要提到`INPATH`和`LOCAL INPATH`的区别,这里用的是HDFS路径,所以数据会被移动而非复制。如果用户误用本地路径,可能会遇到问题,但此处路径以`/`开头,应是HDFS路径。 最后,总结整个命令的作用,可能的应用场景,比如每日日志数据加载到对应的分区中,便于按时间查询。同时,提醒用户注意数据移动的影响,确保源路径数据不再需要,或者有备份。</think>**Hive数据加载命令解析:** $$ \text{LOAD DATA 执行流程} = \begin{cases} \text{数据源} & \text{HDFS路径:/origin_data/gmall/log/topic_log/2022-06-08} \\ \text{目标位置} & \text{表ods_log_inc的dt='2022-06-09'分区} \\ \text{操作类型} & \begin{cases} \text{移动操作} & \text{原始数据从源路径移除} \\ \text{存储变更} & \text{数据存入hive表的HDFS存储目录} \end{cases} \end{cases} $$ **关键技术点说明:** 1. **路径处理机制** - 源路径必须是**HDFS绝对路径**(非本地路径) - 示例路径对应HDFS目录结构: ``` hdfs://namenode:8020/origin_data/gmall/log/topic_log/2022-06-08 ``` 2. **分区映射关系** - 时间对应策略(常见业务场景): $$ \frac{\text{数据产生日期}}{\text{2022-06-08}} \xrightarrow{\text{ETL处理}} \frac{\text{分区日期}}{\text{2022-06-09}} $$ - 分区目录自动生成路径: ``` /user/hive/warehouse/gmall.db/ods_log_inc/dt=2022-06-09 ``` 3. **数据可见性变化** - 执行后立即生效,可通过`SELECT * FROM ods_log_inc WHERE dt='2022-06-09'`查询 - 元数据更新通过MSCK REPAIR TABLE实现(Hive 3.x+自动刷新) **典型应用场景示例:** 假设原始日志按天存储在HDFS的`/origin_data/.../yyyy-MM-dd`路径,通过每日调度任务执行: ```sql LOAD DATA INPATH '/origin_data/gmall/log/topic_log/${src_date}' INTO TABLE ods_log_inc PARTITION(dt='${process_date}'); ``` 其中`${src_date}`为日志生成日期,`${process_date}`为数据清洗日期,实现T+1数据入仓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值