日记

日记

3.18

1
2
3
4
5
6
7
8
maven
廖雪峰maven这一章
根据大数据开发工程师hdfs这一章安装maven,并配置setting,然后配置idea

IDEA
创建maven项目,pom文件细节查看
idea插件快捷下载
idea项目创建scala和java文件夹,添加sdk

3.29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-hudi集成spark后,spark shell启动方式,插入数据,查询数据

-spark 程序的一个基本架构、概念、安装、工作原理、rdd、spark架构相关进程和架构原理、spark运行案例(jar,源码) 、spark-shell以单线程,多线程,yarn运行*
:1.spark shell中写纯数字相加parallelize Array 2.textFile(使用它时,正好遇到了auction算子时才计算的情况,linux文件协议问题,hdfs文件协议) scala语法,reduce,reduceByKey


-flink基本概念 flink运行在yarn上*

-idea配置maven,pom,sdk版本不一致问题
-idea archtype问题
代码类注释

-我第一次配置好sparkcore依赖 idea下载好后,后来换成正确的sparkcore版本,idea并没重新下载,导致报错,重新启动idea后,依赖重新下载

-windows idea操作hadoop hdfs会报window用户权限问题,修改hadoop配置文件


操作hdfs时配置的
-sl4j-api maven仓库里就搜这个 但报红色警告说缺什么类和请初始化文件时
slf4j-log4j12 也要
log4j.properties配置文件放到resources(没有这个文件夹时,创建log4j.properties)
hadoop-client pom配置
hadoop-common
hadoop-hdfs
目前sparkwordcount只需spark-core依赖,log4j的也可以配置,然后就是打包插件

-为代码path设置可适配idea和spark-submit执行

-var val区别

-打包编译插件

-spark-submit脚本编写更方便

启动hadooP historyserver 但目前还是看不到wordcount相关的println

IDEA报错,spark wordcount

1
2
3
4
5
6
7
8
-java.io.FileNotFoundException HADOOP_HOME and hadoop.home.dir are unset
window是需要解压安装winutils/hadoop 并配置环境变量

-Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: hdfs:%5Cbigdata01:9000%5Cspark_testdata%5Cword.txt
hdfs路径url写错,斜杠是/

-Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf
把spark-core provided注释掉就可以了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.imooc.scala

import org.apache.spark.{SparkConf, SparkContext}


/**
* @ Tool:IntelliJ IDEA
* @ Author:ty
* @ Date:2024-03-29-18:36
* @ Description:${description}
*/
object WordCountScala {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local")
.setAppName("WordCountScala")
val sc = new SparkContext(conf)
val linesRDD=sc.textFile("hdfs://bigdata01:9000/spark_testdata/word.txt")
val wordsRDD=linesRDD.flatMap(line=>line.split(" "))
val pairRDD=wordsRDD.map((_,1))
val wordCountRDD=pairRDD.reduceByKey(_+_)
wordCountRDD.foreach(wordcount=>println(wordcount._1+" "+wordcount._2))
sc.stop()
}
}

//pom里只需要spark-core就可以了

代码实操

1
2
3
4
5
6
7
8
scala> val a=Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val rdd = sc.parallelize(a)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:24

scala> rdd.reduce((a,b)=>a+b)
res3: Int = 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
scala> val path="file:///data/spark_testdata/word.txt"
path: String = file:///data/spark_testdata/word.txt

scala> val linesRDD=sc.textFile(path,3)
linesRDD: org.apache.spark.rdd.RDD[String] = file:///data/spark_testdata/word.txt MapPartitionsRDD[5] at textFile at <console>:24

scala> val wordRDD=linesRDD.flatMap(lines=>lines.split(" "))
wordRDD: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[6] at flatMap at <console>:23

scala> val word_1_RDD=wordRDD.map(word=>(word,1))
word_1_RDD: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[7] at map at <console>:23

scala> val wordcountRDD=word_1_RDD.reduceByKey(_+_)
wordcountRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[9] at reduceByKey at <console>:23

scala> wordcountRDD.foreach(wordcount=>println(wordcount._1+" "+wordcount._2))
thank 20:> (0 + 2) / 4]
hello 2
you 2
me 2

linux文件协议

image-20240329162534224

1
2
3
hdfs://bigdata01:9000/test

D:\test

scala语法错误

image-20240329162552916

image-20240329162620378

image-20240329162715759

image-20240329162822563

image-20240329162850088

image-20240329162932190

image-20240329164642849

image-20240329164705870

image-20240329165125125

3.30

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--spark historyserver开启

--flink安装
flink on yarn两种提交任务方式

--flink idea项目 pom依赖配置 flink-java flink-streaming-java_2.12 flink-scala_2.12 flink-streaming-scala_2.12 flink-clients_2.12

--flink historyserver

--Please check if you store classloaders directly or indirectly in static fields.

-flink容错checkpoint、state数据存储位置、flink搭配kafka一起使用

-spark rdd持久化、共享变量、accumulator
-spark 宽依赖、窄依赖、stage、deploy-mode的区别

-spark shuffle策略发展过程、checkpoint、checkpoint流程、checkpoint和持久化的区别、checkpoint和持久化结合使用的技巧

3.31

1
2
3
4
5
6
7
8
9
10
-spark非默认序列化机制kryo

-spark datasink saveastextfile

-spark持久化实操cache() //注意位置和checkpoint的区别

-spark checkpoint实操(注意当在spark-submit时传入hdfs路径作为代码参数时,直接写路径即可)
spark-submit --master yarn --deploy-mode client --class com.imooc.scala.CheckpointOpScala --num-executors 1 --executor-memory 1G /data/soft/sparkjars/db_spark-1.0-SNAPSHOT-jar-with-dependencies.jar /spark_testdata/checkpointJob_result

--spark-submit作为脚本时的编写细节

image-20240331160926254

1
2
3
4
5
6
7
8
9
10
11
12
13
-spark parallelize传入Array("xxx","xxx")
-case class scala

-spark序列化 创建一个person类

-scala Int类型大写要
-kryo序列化到内存 通过web里的storage查看 需要任务不能停
-内存gc英文
-spark内存调优 1.持久化时使用序列化kryo 2.调整rdd缓存0.6和rdd新建对象0.4占executor内存比例 3.jvm年轻代和老年代、年轻代各部分比例 4.executor-memory内存调大
-并行度调节 rdd分区数,task数,excutor数,cpu核的关系
-数据本地化几种级别
-spark-submit设置executor数量时,如果deploy-mode是cluster,则driver也要算作一个executor,所以实际executor数量会少一个
-注意设置全局并行度不要设置在初始化rdd之后
1
使用kryo序列化

image-20240331180209474

1
不使用kryo序列化

image-20240331180424379

1
使用kryo序列化但不注册

image-20240331180604099

4.1

1
2
3
4
5
6
7
8
9
10
11
-- spark-submit 为了方便所以编写了sh脚本,但注意每行除最后一行,每行后都有空格+\ 一定要注意\后面无空格。浪费我一个小时起码

--topN主播实操
--记得每次在idea执行时,把相关依赖的provided去掉
--reducebykey记得要注意下前一个rdd(x1,x2) x2是否为数据类型,不然只是字符串拼接
--groupByKey()和groupBy(x)居然不一样结果 reduceby(x)和reducebyKey()这个没试
--spark hadoop historyserver建立shell脚本方便启动停止
--sparkSql读取json数据
--dataframe常见算子操作
--dataframe sql操作
--rdd转dataframe dataFrame转rdd java代码值得注意下
1
2
--Unable to parse template "Class" Error message: This template did not produc
settings->File and Code Templates-> Files ->Class 看自己模板是否是空的。

4.5

1
--rdd转dataframe编程方式

4.13

1
2
3
Tomcat 6:   Servlet 2.5、JSP 2.1、EL 2.1
Tomcat7: Servlet 3.0、JSP 2.2、EL 2.2
Tomcat8: Servlet 3.1、JSP 2.3、EL 3.0

4.24

1
MPP 是 "Massively Parallel Processing"(大规模并行处理)的缩写

4.30

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
在Spring框架(特别是Spring Boot)中,@Value是一个用于注入配置值到Java类的字段或方法参数的注解。在你给出的例子中:

java
@Value("${storage.local:/var/static}")
private String storageLocation;
这里的@Value("${storage.local:/var/static}")做了以下几件事:

注入配置值:它尝试从Spring的Environment中查找名为storage.local的属性值。
默认值:如果storage.local在配置文件中没有定义,那么它会使用:后面的值作为默认值,即/var/static。
因此,这段代码的意思是:

尝试从配置中获取storage.local的值。
如果storage.local在配置中没有定义,那么使用/var/static作为storageLocation字段的值。
通常,这样的配置可以在application.properties或application.yml等配置文件中定义,例如:

application.properties:

properties
storage.local=/path/to/my/local/storage
或者

application.yml:

yaml
storage:
local: /path/to/my/local/storage
如果application.properties或application.yml中没有定义storage.local,那么storageLocation字段的值将为/var/static。
1
2
3
@PostConstruct

@PreDestroy

5.6

1
2
3
4
5
6
7
Active MQ 
Atermis
JMS
rabbitMQ
redis
kafka
openapi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Office Automation,简称OA

PMP®全称Project Management Professional,中文名:项目管理专业人士认证。由美国项目管理协会(PMI)发起。

PMI-ACP®全称Agile Certified Practitioner,中文名:PMI敏捷管理专业人士。由美国项目管理协会(PMI)发起于2011年推出。

PMP®和ACP®的区别
(1)知识体系的源起不同
PMP®是传统的项目管理模式,源起于建筑工程项目,后期将其理论化、抽象化、标准化,形成了一个项目管理框架。但是将其应用于软件行业,在实践层面就不太顺畅,主要是因为软件工程的不确定性太大。ACP®源起于软件工程,并逐步向其它领域推广,所以ACP®更适合于软件行业,但如果有PMP®的知识作为支持就会形成更强的组合。
(2)学习教材和内容不同
PMP®的学习更偏重于理论知识,学的是标准的项目管理知识体系,教材是PMBOK。ACP®的学习侧重于敏捷开发管理,主要学习敏捷方法和策略。学习教材是敏捷实践指南。
(3)考试知识交叉点不同
PMP®的学习教材中,有部分敏捷方面的知识,比如敏捷思维,看板方法,迭代,发布等。在ACP®的考试中,也会出现少量PMP®的知识,比如资源管理、风险管理、沟通管理,只需大概了解即可。
(4)考试题库不同
由于PMP®引进的时间较长,因此题库也是非常丰富的。ACP®在中国的推广时间较短,题库相对来说没有那么丰富。但是ACP®考试需要掌握的知识点比PMP®少,考试难度也比PMP®要低。因此考过了PMP®的小伙伴再考ACP就会非常容易了。
(5)应用场景不同
先了解自己所在企业目前的状况再来决定先考哪个证书, 如果企业正在用敏捷或想要转型敏捷,那么可以先学习ACP®。如果企业是瀑布式开发,想多学习主流的开发管理模式,那么可以先考PMP®。
三,PMP®和ACP®的含金量
看含金量最直观的方式是什么?市场认可度和适用范围。
PMP®在中国已经发展了20多年的沉淀,4年就做一次更新,现在打开招聘软件就会看到大厂的要求都会有一条“PMP®证书优先”,这就直接证明了PMP®的地位。
而看ACP®,并没有额外的标注,说明普及和市场认可度都比较低,从价值的角度来说,肯定是没有PMP®高的。一般要考ACP®的同学都会先考PMP®,对整个知识框架做个积累,再考ACP®就轻松很多,而且有了PMP®,大家都会比较认可。
总结一下,PMP®项目管理和ACP®敏捷项目管理各有千秋,不能相互取代。根据公司环境和项目需求来选择认证,认证含金量才最高。
1
生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。

2024.9.19

1
2
3
4
几种数据建模方法
候选码,主键,主属性,非主属性,外键
1,2,3,bc,4范式
ACID,CAP,BASE理论

2024.9.24

1
2
3
4
5
电商数据仓库案例:几种用户行为类型并且包含哪些字段
用户行为数据从生成到服务器服务
数据采集行为和订单
增量采集和全量采集 5张全量采集,4张增量采集
shell $# $0 $1234 $?

拉链表


image-20240924175158324

脱敏

电话字段脱敏 bigint
concat(left(mobile,3),’****’,right(mobile,4)) as mobi


sqoop对空值null处理

1
2
3
4
5
6
7
8
9
10
11
sqoop import \
--connect jdbc:mysql://192.168.182.1:3306/imooc?serverTimezone=UTC \
--username root \
--password admin \
--target-dir /out2 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t' \
--query 'select id,name from user where id >1 and $CONDITIONS;' \
--null-string '\\N' \
--null-non-string '\\N' \

hdfs统计行数

1
2
3
hdfs dfs -cat /data/ods/payment_flow/20260101/part-m-00000 | wc -l

hdfs中没有wc命令

idea运行文件没有执行按钮

1
可能是没有确立sources root

maven项目打开不能识别

1
2
最外层目录的pom文件上右键
Add as Maven Project

2024.9.25

hive,hdfs,linux上数据的关联要搞清楚

注意事项

考虑到 SQL重跑的情况,需要在SQL语句中添加if not exists

hive 中可以用 string、date 和 timestamp 表示日期时间,date 用 yyyy-MM-dd 的形式表timestamp用 yyyy-MM-dd hh:mm:ss 的形式表示,string 可以表示 yyyy-MM-dd 和示,yyyy-MM-dd hh:mm:ss
这三种格式之间可以互相转换,不过在用的时候建议格式统一,String可以表示另外两种格式,并且也支持日期的大小比较,所以在这里针对时间统一使用 String 表示。

image-20240926004550468


针对 ods层表中的数据进行清洗,参考数据清洗规则,按照实际情况对数据进行清洗注意:如果清洗规则使用SQL可以实现,那么就使用SQL实现数据清洗,如果清洗的规则使用SQL实现起来非常麻烦,或者使用SQL压根无法实现,此时就可以考虑需要使用MapReduce代码或者Spark代码对数据进行清洗了由于我们这里采集的数据还是比较规整的,可以使用SQL实现,所以我们就直接使用SQL实现数据清洗了。

1:原始json 数据中的用户id字段名称为 uid,但是在商品订单数据中用户id 字段名称为user_id,这块需要注意一下,在实际工作中会有这种情况,客户端数据和服务端数据的个别字段名称不一致,所以我们在使用的时候最好是统一一下,后期使用起来比较方便,所以在这里我会通过 uid 解析数据,解析之后,给字段起别名为user id。

2:hive 中的 timestamp 只能解析 yyyy-MM-dd HH:MM:SS 格式的数据,所以针对这里面的acttime 字段我们使用 bigint 类型

3:为了考虑到 SQL重跑的情况,在使用insertintotable 的时候最好改为insert overwritetable,否则 SQL重复执行的时候会重复写入数据

1
2
3
4
5
需求理解
新增用户数 3张表
主活用户数 基于新增用户其中一张表
7日流失 还是基于新增用户其中一张表
app启动次数 还是基于新增用户其中一张表

2024.9.26

hive外部分区表在项目中各层的建设细节

hadoop2和hadoop3hdfsweb端口

image-20240926174704852

分区表删除分区

alter table table_name drop partition(dt=’xxxxxx’),不要dt=会报错,同样添加分区时也一样

2024.9.27

公共字段的含义

image-20240927170512409

数组array

1
Arrays.toString(ns)

排序 冒泡排序

集合arraylist 支持添加null值

linkedlist

1
2
3
4
List<String> list = new ArrayList<>(); //add支持null
List<Integer> list = List.of(1, 2, 5); //不支持添加null值

Arrays.asList(array)

添加,删除,遍历,打印

array和list互相转换

2024.9.28

get(int)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢。所以我们要始终坚持使用迭代器Iterator来访问List

要记住,通过Iterator遍历List永远是最高效的方式。并且,由于Iterator遍历是如此常用,所以,Java的for each循环本身就可以帮我们使用Iterator遍历。

实际上,只要实现了Iterable接口的集合类都可以直接用for each循环来遍历,Java编译器本身并不知道如何遍历集合对象,但它会自动把for each循环变成Iterator的调用,原因就在于Iterable接口定义了一个Iterator<E> iterator()方法,强迫集合类必须返回一个Iterator实例。

如果我们调用List.of(),它返回的是一个只读List。Arrays.asList(array)也是

1
2
// 排序 内置的 
Arrays.sort(ns);

插入排序,快排

1
2
System.out.println(list.contains("X")); // false
System.out.println(list.indexOf("C")); // 2

equals()

10.8

1
2
3
4
5
6
7
关闭平板底栏搜索框
github客户端
git工具
nodejs
npm
chrome浏览器每次下载都要等待确认功能关闭
github 双因子验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
interprise                           企业                          
Repository 存储库
Workflow 工作流 工作流程
filter 筛选 过滤器
tutorial 教程 辅导资料 教师的 导师的
protip 专家提示
drag 拖拉
drop 放
bubble 气泡
authentication 验证 鉴别
prompt n.v 提示 激起 刺激物 adj迅速的
passkey 秘钥
nickname 昵称
credential 证书凭证
ecosystem 生态系统
securved by 由。。。担保
Tips and Tricks 提示和技巧
FAQs Frequently Asked Questions
tortoise 乌龟
encrypted 加密的
Undergraduate 大学本科
graduate 研究生
Multilingual 多语言的
evaluation 评估
Grade school math 小数学
omni 全方位的
significant advancement 重大进步
represent 代表 象征

1
2
3
4
5
6
7
8
9
10
11
12
You are being redirected to the authorized application.

This is used to identify the commits you create.Anyone will be able to see this information if you publish commits.

ProTip! You can drag & drop an existing repository folder
here to add it to Desktop

Passkeys are webauthn credentials that validate your identity using touch, facial recognition, a device password, or a PIN. They can be used as a password replacement or as a 2FA method

Authenticator apps and browser extensions like 1Password, Authy, Microsoft Authenticator, etc. generate one-time passwords that are used as a second factor to verify your identity when prompted during sign-in.

For complex reasoning tasks this is a significant advancement and represents a new level of AI capability. Given this, we are resetting the counter back to 1 and naming this series OpenAI o1.

2024.10.9

1
outlook邮箱 微软的

2024.10.11

1
2
3
4
5
6
7
8
9
10
ultimate		最终的
professional 专业的
lite 精简的
fetch 拿来 获取
pull 拉
push 推
rush 冲 匆忙
insertion 插入
authenticity 真实性

2024.10.12

1
2
3
公众号:
中国移动招聘
中国工商银行人才招聘

2024.10.13

1
2
3
4
mysql:



2024.10.14

mysql

1
2
3
mysql:
1.mysql不区分大小写,如表名,属性,关键字
2.当字符串为数据类型时,做where判断时加或者不加引号都行,如时间格式
1
2
3
4
5
6
hadoop概念
发行版本
hadoop版本

cdh,hdp,cdp
在Cloudera和Hortonworks合并后,Cloudera公司推出了新一代的数据平台产品CDP Data Center(以下简称为CDP)

hdfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
hdfs:
core-site.xml fs.defaultfs temppath
hadoop-env.sh jdk log
hdfs-site.xml replicaition secondarynamenode
mapred-site.xml mapreduce.framework 配置为yarn资源调度框架
workers文件
yarn-site.xml resourcemanager所在地址

bin
etc
sbin

start-dfs.sh
stop-dfs.sh
start-yarn.sh
stop-yarn.sh
start-all.sh
stop-all.sh

awk命令

1
2
3
4
5
6
awk命令 $0 $1 $2 ...
s0所有列

awk '{print $1}' 文件
ls -l | awk '{print $9,$5}'
awk -F, '{print $1}' 文件 --假设文件以,分隔

image-20241014231227465

1
2
3
4
5
先匹配行

awk '/world/ {print $0}' /mydata.txt
awk '/world/ {print $1}' /mydata.txt
awk '/world/ {print $2}' /mydata.txt

image-20241014231533321

1
2
3
4
5
先匹配具体那一列

awk '$2~/world/ {print $0}'
awk '$2~/world/ {print $1}'
awk '$2~/world/ {print $2}'

拼成一行

1
2
3
4
5
6
7
8
cat 某特定文件 | awk '{tmp=$8;getline;print tmp","$8}'


这段AWK脚本的作用是处理文本数据,具体来说,它读取输入数据的每一行,并将当前行的第八个字段($8)存储在一个临时变量tmp中,然后读取下一行数据,并打印出之前存储的第八个字段(tmp)和当前行的第八个字段($8),两者之间用逗号分隔。

getline:这是一个AWK内置函数,用于从输入中读取下一行数据,并更新$0(整行数据),$1、$2等字段变量。注意,getline读取的数据不会自动打印,除非你在脚本中明确指定。

print tmp","$8:这行代码打印变量tmp(即上一行的第八个字段)和当前行的第八个字段($8),两者之间用逗号,分隔。

namenode

1
2
3
4
5
6
7
8
9
10
11
web 9870
hdfs-default.xml
dfs.namenode.name.dir {hadoop.temp.dir}/dfs/name
core-default.xml

首先是NameNode,NameNode是整个文件系统的管理节点
它主要维护着整个文件系统的文件目录树,文件/目录的信息 和 每个文件对应的数据块列表,并且还负责接收用户的操作请求

可以理解为namenode维护了两份关系:
第一份关系:file 与block list的关系,对应的关系信息存储在fsimage和edits文件中,当NameNode启动的时候会把文件中的元数据信息加载到内存中
第二份关系:datanode与block的关系,对应的关系主要在集群启动的时候保存在内存中,当DataNode启动时会把当前节点上的Block信息和节点信息上报给NameNode
1
2
3
4
edits
fsimage
seen_txid
versions

datanode

1
2
3
hdfs-default.xml

dfs.datanode.data.dir {hadoop.temp.dir}/dfs/data

hdfs高级

1
2
回收站
安全模式

shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@bigdata01 ~]# mkdir -p  /data/shell
[root@bigdata01 ~]# cd /data/shell
[root@bigdata01 shell]# vi uploadLogData.sh
#!/bin/bash

# 获取昨天日期字符串
yesterday=$1
if [ "$yesterday" = "" ]
then
yesterday=`date +%Y_%m_%d --date="1 days ago"`
fi

# 拼接日志文件路径信息
logPath=/data/log/access_${yesterday}.log

# 将日期字符串中的_去掉
hdfsPath=/log/${yesterday//_/}
# 在hdfs上创建目录
hdfs dfs -mkdir -p ${hdfsPath}
# 将数据上传到hdfs的指定目录中
hdfs dfs -put ${logPath} ${hdfsPath}

HA、Federation

2024.10.15

shell

1
2
3
4
5
6
>和>>
touch
root用户的~目录是 /root
运算符前后要有空格
赋值等号左右不能有空格
条件判断[空格条件表达式空格]

2024.10.16

1
2
3
4
5
shell
windows是 ipconfig
linux是 ifconfig ip addr
chown
正则表达式

2024.10.18

2024.11.1

1
2
3
4
5
6
7
8
9
10
mysql集合操作不支持except 可以用外连接实现
rownumber() over(order by) 不一定要partition by
CASE when xx then xx else xx end 有个end别忘记了
timestampdiff
date_format(now(),'%Y-%m')
now()
curdate()
month()
week()
year()
1
2
3
4
5
6
7
8
SELECT a.*,c.cname
FROM sc a
LEFT JOIN course c
ON a.cid = c.cid
WHERE (SELECT COUNT(1)
FROM sc b
WHERE b.cid = a.cid AND b.score > a.score) < 3
ORDER BY cid DESC,score DESC;
1
2
3
4
5
6
7
select a.Sno, a.score,(select count(b.score)+1 --这样接正确了,奇怪
from sc as b
where b.score>a.score) as r
from sc as a
order by r;

这个相当于实现了排序的功能

11.25

1
2
3
4
~~~

## 2025.6.21

mysql:1132-1159
shell:
大数据:mapreduce处理步骤,mapper,reducer类写法,hdfs回收站,HA,联邦
java:
python:

1
2
3

### 2025.6.22