0%

在日常生活中,随机数我们很多时候都会经常接触到,比如说游戏抽卡,随机到的数值就可以决定这波抽卡的结果是欧皇附体、正常水平还是直接吃井(保底)。正如其它编程语言一样,Python也有生成随机数的功能,其中有一个很重要的模块即是random,为了加深记忆,这篇文章记录一下该模块的一些主要的函数及其功能。

阅读全文 »

在MySQL中,需要用到日期相关的函数的场景还是非常多的,不论是时间戳和日期的转换,还是说不同日期间的数据比较,因此有必要记录一些常见的日期函数,巩固自己在这方面的知识点。

在开始本篇文章之前,先说一下MySQL常见的三种时间类型, date, datetime和timestamp三者之间的区别。

  1. date表示的是YYYY-MM-DD的形式,只能具体到日,而datetime和timestamp均可以表示到时分秒
  2. timestamp可以表示的时间范围为1970-01-01 00:00:01到2038-01-19 03:14:07,而datetime的话可以表示的时间会比较大,从 1000-01-01 00:00:00 到 9999-12-31 23:59:59
  3. timestamp表示的时间会根据当前数据库所在时区进行转换(存储时按照UTC时区存储,需要用的时候再转成数据库所在时区),而datetime的话时间是固定住的,不会因为时区变化而显示不同的时间
  4. timestamp占用4个字节存储,datetime占用8个字节存储,date占用3个字节存储
阅读全文 »

前几天参加了一个公司的面试,到了后面面试官出了一个SQL相关的题目:

给定访问id,用户id,页面id,访问时间,求出最近一个月对id为100的页面有访问记录且访问该页面次数大于10次的用户id

数据的形式类似于以下这样(表名为views):

view_id user_id page_id view_time
1 abc 100 2021-01-15
2 def 101 2021-02-01
阅读全文 »

这段时间参加了几个公司的在线笔试,发现了一个很有意思的现象,因为不同公司使用的测试平台不同,所以将输入的数据告诉代码的方式也会有所区别。一种是“保姆”类型,即作为应试者,并不需要考虑如何将输入转换成机器能看得懂的代码,而只要实现解决问题的特定函数就可以了。输入的话已经有固定的代码实现了。典型例子比如牛客、Leetcode以及HackerRank。另外一种是应试者需要考虑如何将输入转变为代码的全过程,这就有些像本科时做的那种Online Judge,给个题目,然后编程板里全是空白的,需要从零开始写起。

比如说有这样的输入样例,其中第一行代表总共有多少数字,而第二行的输入代表每个数字的内容。

5
1 2 3 4 5

阅读全文 »

今天想到了去年在面一家startup的时候碰到的一个面试题。给定一组json字符串构成的API回调数据,按照某个特定的排列顺序进行输出。类似于下面这个栗子。

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
API_response = {
"summary": {
"info1": 4200,
"info2": 30
},
"trips": [
{
"trip_id": 10001,
"duration": 1956,
"distance": 16
},
{
"trip_id": 10002,
"duration": 891,
"distance": 4
},
{
"trip_id": 10003,
"duration": 898,
"distance": 10
},
{
"trip_id": 10004,
"duration": 898,
"distance": 5
},
]
}

我们可以很容易地想到在SQL环境下的操作方法,即直接order by。但在Python的环境下,如果我们需要按照duration从小到大的顺序排列,且在满足相同duration的时候,按照distance从大到小输出对应的数据,应该如何操作呢?

阅读全文 »

今天在查阅Python的官方文档的时候,注意到了global和nonlocal这两个关键字,它们都和函数的作用域有关联,且效果比较类似,都可以修改函数定义域之外的特定值,但是两者之间也有着一定区别。

结合官方文档以及自己的代码实践,我对它们的作用进行了一些总结。

Global关键字修饰的是整个代码块中的全局变量。即加上global关键字后,本来只能在某一代码块(比如函数)作用域里起效果的局部变量,就升级成在整个代码中都可以读取的全局变量了。

如果说在代码最外层已经有该变量的定义(不论是否加上global关键字),或者在其它代码块里已经有该全局变量的定义,那么在代码块里面对同名变量加上global关键字后,如果修改代码块里面该变量的值,那么所有同名的全局变量都会发生改变。

阅读全文 »

光阴如梭,转眼间又到了新的一年。感觉过去这一年对自己来说确实挺艰南的,不管是上半年的网课,还是下半年的戛然而止的第一份工,亦或是之后简历石沉大海,以及屡败屡战的求职经历,都为自己的这一年增加了不少魔幻的特征。

虽然说这第一份data相关的工作比较短暂,不过自己从中也积累了一些经验,也对整个项目作出了相关的贡献。因此感觉还是有必要记录以下自己在这过程中积累的一些data相关的理解吧。(不定期更新)

为什么我们需要数据仓库

当数据量相对较小的时候,一般都是使用数据库来进行数据的存储和读取,常见的主流关系型数据库包括MySQL、SQL Server以及PostgreSQL等。但是当业务不断发展,数据量不断扩大的时候,使用数据库就会遇到一定的瓶颈。

  1. 随着数据量的增加,查询效率降低 (数据库层面有读写分离、分库分表等方法,但当数据量更大的时候,这些解决方法依然存在瓶颈)
  2. 进行业务查询的时候,表的数量繁多,同时由于范式约束,很多时候查询需要对不同表进行各种join,费时
  3. 表里可能有非法字段,影响查询结果

当遇到这些瓶颈的时候,可以考虑使用数据仓库来解决这些问题。笔者之前做的是离线数仓,因此下文中的数仓,如无特别说明,均指离线数仓。

离线数仓和数据库的一个很大的区别在于,数据库是需要同时支持实时的增删查改操作的,而离线数仓的话主要专注于读取数据这一方面,因为离线数仓主要存储的是历史数据,所以在现实的生产环境中,根据实际需要,可能一天写一次或两次历史数据,也有可能几天写一次数据,因此它对于写的时效性要求不是很高(一般来说数据写入数仓都是在凌晨进行,可以用像Airflow这样的工具来进行调度),所以它的设计主要专注于读取数据的效率。

阅读全文 »

在使用数据库/数据仓库的过程中,我们可能会遇到以下几个情况:

  1. 需要得到的数据既要包括聚合后的数据, 也需要包括没被聚合的字段
  2. 需要获取多个字段前n条的数据

这个时候如果我们使用传统的group by聚合函数的话,可能会出现以下的问题,

阅读全文 »

最近面试的时候被问到了星型模型和雪花模型的问题,然后把星座模型当成雪花模型说了…为了巩固自己在这一方面的知识,决定写一篇文章来记录一下。

星型模型、雪花模型和星座模型是数据仓库维度建模中重要的三种模型,接下来说一下它们的特点以及相互间的联系。

阅读全文 »

之前一直以为and和or都是用来进行布尔判断的,不过在 Learn Python the hard way 一书的Boolean Practice一节中看到了一个Common Question:

Why does “test” and “test” return “test” or 1 and 1 return 1 instead of True?

这引起了我的好奇,它们返回的可以是其它类型的值么?

于是我查了下相关的文档,发现and和or的运算规律是这样的:

阅读全文 »