数据仓库岗面试
1.自我介绍
2.求用户连续登录3天,要讲出多种解法
解法1(使用SQL):
SELECTuserid
FROMloginrecord
WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) = 1AND DATEDIFF(day, LAG(time) OVER (PARTITION BY userid ORDER BY time), TIME) = 2;
解法2(使用Hive):
SELECTuserid
FROM(SELECTuserid,time,LAG(time) OVER (PARTITION BY userid ORDER BY time) AS prev_time,DATEDIFF(day, time, prev_time) AS days_diffFROMloginrecord) AS temp
WHEREdays_diff = 1AND DATEDIFF(day, prev_time, TIME) = 2;
解法3(使用Python):
from datetime import datetime, timedeltadef is_continuous_login(login_records):user_login_days = {}for record in login_records:userid, time = recorddays_diff = (datetime.now() - datetime.strptime(time, "%Y-%m-%d")).daysif userid not in user_login_days:user_login_days[userid] = []if len(user_login_days[userid]) > 0 and days_diff == 1:prev_time = user_login_days[userid][-1][1]if days_diff == 1 and (datetime.now() - datetime.strptime(prev_time, "%Y-%m-%d")).days == 2:return Trueuser_login_days[userid].append(time)return Falselogin_records = [(1, "2022-01-01"),(1, "2022-01-02"),(1, "2022-01-03"),(1, "2022-01-04"),(2, "2022-01-01"),(2, "2022-01-02"),(2, "2022-01-03"),
]print(is_continuous_login(login_records))
以上三种解法均可实现求用户连续登录3天的目的。
3.将数据表行转列
行转列通常使用以下方法:
-
使用SQL查询实现行转列:
SELECTcolumn1 AS column1,column2 AS column2,column3 AS column3 FROMyour_table GROUP BYcolumn1, column2, column3; -
使用SAS编程实现行转列:
data want;set your_table;transpose data = want;run; -
在ASP.NET中使用报表行转列:
在Visual Studio中,创建一个新的报表项目,然后将数据源绑定到报表中。在设计器中,将“行”转换为“列”的方式有以下几种:
a. 使用“分组与排序”任务窗格对数据进行分组。
b. 使用“聚合”功能将数据按照指定的字段进行聚合。
c. 使用“交叉表”功能将数据行转换为列。 -
使用MySQL实现行转列:
SELECTcolumn1 AS column1,SUM(IF(name2 = 'yes', 1, 0)) AS column2,SUM(IF(name3 = 'yes', 1, 0)) AS column3,SUM(IF(name4 = 'yes', 1, 0)) AS column4 FROMyour_table GROUP BYcolumn1;CREATE VIEW column_view ASSELECTcolumn1,column2 AS column2,column3 AS column3,column4 AS column4FROMyour_tableGROUP BYcolumn1; -
使用Oracle实现行转列:
SELECTcolumn1 AS column1,SUM(IF(column2 = 'yes', 1, 0)) AS column2,SUM(IF(column3 = 'yes', 1, 0)) AS column3,SUM(IF(column4 = 'yes', 1, 0)) AS column4 FROMyour_table GROUP BYcolumn1;注意:具体实现行转列的方法和SQL语句取决于您的数据表结构和需求。在实际操作中,请根据实际情况调整相应的代码。
4.求两数之和,除了哈希之外的其他解法
一种简单的非哈希解法是使用双指针法。以下是Python代码示例:
def add(a, b):result = []carry = 0p1, p2 = 0, 0while b != 0:x = a[p1] + b[p2] + carrycarry = x // 10result.append(x % 10)p1 += 1p2 += 1while carry:result.append(carry % 10)carry //= 10return resulta = [1, 2, 3]
b = [4, 5, 6]
print(add(a, b)) # 输出:[5, 7, 9]
这种方法的时间复杂度为O(n),其中n是两个数的长度。这里使用了Python列表来存储结果,你可以根据需要使用其他数据结构。
5.对scala的了解
Scala是一门多范式的编程语言,设计初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的各种特性。它运行在标准的Java平台上,可以与所有的Java类库无缝协作。Scala的特点包括:1. 面向对象:Scala是一种面向对象的语言,每个值都是对象,每个方法都是调用。举例来说,如果你执行1+2,则对于Scala而言,实际是在调用Int类里定义的名为+的方法。
2. 函数式编程:Scala也是功能完整的函数式编程语言。函数式编程以两大核心理念为指导:函数是一等公民;程序中的操作应该将输入值映射成输出值,而不是当场修改数据。即方法不应该有副作用。
3. 与Java的兼容性:Scala可以与Java无缝对接,其在执行时会被编译成JVM字节码,这使得其性能与Java相当。Scala可以直接调用Java中的方法、访问Java中的字段、继承Java类、实现Java接口。Scala重度复用并包装了原生的Java类型,并支持隐式转换。
4. 精简的语法:Scala的程序通常比较简洁,相比Java而言,代码行数会大大减少,这使得程序员对代码的阅读和理解更快,缺陷也更少。
5. 高级语言的特性:Scala具有高级语言的特定,对代码进行了高级别的抽象,能够让你更好地控制程序的复杂度,保证开发的效率。
6. 静态类型:Scala拥有非常先进的静态类型系统,Scala不仅拥有与Java类似的允许嵌套类的类型系统,还支持使用泛型对类型进行参数化,用交集(intersection)来组合类型,以及使用抽象类型来进行隐藏类型的细节。通过这些特性,可以更快地设计出安全易用的程序和接口。总的来说,Scala是一门功能强大的编程语言,具有多种特点,能够满足不同开发需求。
6.求两数之和要用到Spark的什么算子?
在Spark中,求两数之和的算子是+运算符。如果你要在Spark中计算两个数列之间的和,可以使用union算子将两个数列合并,然后使用map算子对每个元素进行加法运算。以下是一个简单的例子:
from pyspark import SparkContext# 创建两个数列
sc = SparkContext()
array1 = [1, 2, 3]
array2 = [4, 5, 6]# 将两个数列转换为RDD
rdd1 = sc.parallelize(array1)
rdd2 = sc.parallelize(array2)# 计算两数之和
rdd_sum = rdd1.union(rdd2).map(lambda x: x + 1)# 获取结果
result = rdd_sum.collect()
print(result) # 输出:[2, 3, 4, 5, 6, 7, 8, 9]
在这个例子中,我们首先创建了两个数列(array1和array2),然后将它们转换为Spark的RDD。接下来,我们使用union算子将两个RDD合并,然后使用map算子对每个元素进行加法运算。最后,我们使用collect方法将结果收集到一个数列中。
在Scala中,使用Spark求两数之和可以使用reduce算子。以下是一个示例:
import org.apache.spark.SparkConf
import org.apache.spark.api.java.JavaRDD
import org.apache.spark.api.java.JavaSparkContextobject SparkSum {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("SparkSum").setMaster("local")val sc = new JavaSparkContext(conf)val nums = sc.parallelize(Seq(1, 2, 3, 4, 5))val sum = nums.reduce((a, b) => a + b)println("Sum: " + sum)sc.close()}
}
在这个示例中,我们首先创建了一个`SparkConf`对象,用于配置应用程序的名称和运行模式。然后,我们创建了一个`JavaSparkContext`对象,用于执行后续的操作。接下来,我们使用`parallelize`算子将一个Seq对象转换为一个RDD。然后,我们使用`reduce`算子计算RDD中所有元素的和。最后,我们打印出计算结果并关闭`JavaSparkContext`。
7.数仓分层具体可分为哪些层?
数仓分层具体可分为以下几层:1. ODS层(原始数据层):存放原始的数据,直接加载原始日志、数据,数据保持原貌不作处理。2. DWD层(明细数据层):结构和粒度与原始数据表保持一致,对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据),并进行轻度汇总。3. DWS层(服务数据层):以DWD层为基础,进行轻度汇总。一般聚集到以用户当日,设备当日,商家当日,商品当日等等的粒度。4. ADS层(数据应用层):为各种统计表提供数据,也有的地方把这层叫做APP层。这些层次划分有助于对数据进行有系统的分析整理,便于进行联机分析处理(OLAP)和数据挖掘等操作。
8.ods到dwd层做了哪些处理?
数据从ODS层(Operational Data Store)到DWD层(Data Warehouse Detail)的主要处理包括:1. 数据清洗:去除无效数据、处理异常值、填补缺失值等。
2. 数据转换:将ods层的数据按照预定的格式和标准进行转换,以便后续的分析和处理。
3. 数据合并:将来自不同源的数据进行整合,形成统一的数据存储。
4. 数据分区:根据业务需求,将数据按照时间、地域、产品等维度进行分区。
5. 数据压缩:对DWD层的数据进行压缩,以节省存储空间。
6. 数据建模:构建数据模型,为数据分析和报表提供支持。这些处理步骤旨在提高数据质量、简化数据处理过程、降低数据存储成本,并为后续的数据分析和决策提供可靠的数据基础。
9.数据倾斜
数据倾斜是指在分布式计算系统中,任务分配不均导致某些节点的负载过高,从而使得整个系统的性能受到影响。在大数据处理过程中,数据倾斜表现为以下几个方面:1. 在Hadoop中,数据倾斜表现为有一个或几个Reduce任务卡住,进度停滞在99.99%,无法完成。同时,各种Container报错,OOM(内存溢出)等异常现象也会出现。异常的Reducer读写数据量极大,远超过其他正常Reducer。2. 在Hive中,数据倾斜主要发生在SQL的Group By和Join On操作上,尤其是与数据逻辑关系密切的查询。3. 在Spark中,数据倾斜包括Map阶段的倾斜和Reduce阶段的倾斜。Map阶段的倾斜表现为某些Mapper处理的数据量远大于其他Mapper,Reduce阶段的倾斜则与Hadoop类似,表现为某些Reducer任务进度滞后。数据倾斜的原因主要有:1. 负载均衡实施不佳:缓存数据在分布式节点间的分布不均,导致部分节点负担过重。2. 聚合操作:如Group By、Join On等操作可能导致数据倾斜。3. 空值产生的数据倾斜:空值在聚合操作中会被忽略,可能导致数据分布不均。4. 数据量差异:不同数据源的数据量差异过大,导致部分任务处理的数据量过大。解决数据倾斜的方法:1. 调整任务数:根据数据量和节点性能,合理调整任务数,避免任务数过少或过多。2. 数据预处理:对数据进行预处理,如过滤、去重、拆分等,减小数据倾斜的影响。3. 修改SQL:优化SQL查询,如使用Map Join替代Reduce Join,避免使用Count(Distinct)等操作。4. 子查询处理:对子查询结果进行去重处理,避免重复数据导致的倾斜。5. 优化排序和选择:在查询中使用排序和选择操作,提高数据分布的均匀性。6. 调整缓存策略:优化缓存数据分布,避免数据倾斜。
相关文章:
数据仓库岗面试
1.自我介绍 2.求用户连续登录3天,要讲出多种解法 解法1(使用SQL): SELECTuserid FROMloginrecord WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) 1AND DATEDIFF(day, LAG(time) OVER (PARTI…...
企业建数仓的第一步是选择一个好用的ETL工具
当企业决定建立数据仓库(Data Warehouse),第一步就是选择一款优秀的ETL(Extract, Transform, Load)工具。数据仓库是企业数据管理的核心,它存储、整合并管理各种数据,为商业决策和数据分析提供支…...
行情分析 - - 加密货币市场大盘走势(11.23)
大饼昨日又开始了回调,因为FTF消息,而实际还是要下跌的,耐心等待即可。 空单策略:入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励,目前上涨打了止损,现在入场是好的机会,等待即可。…...
穿山甲SDK 集成·android接入广告·app流量变现
接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 随着移动互联网的快速发展,广告成为了许多应用开发者获取收益的主要方…...
深度学习模型训练计算量的估算
深度学习模型训练计算量的估算 方法1:基于网络架构和批处理数量计算算术运算次数前向传递计算和常见层的参数数量全连接层(Fully connected layer)参数浮点数计算量 CNN参数浮点数计算量 转置CNN参数浮点数计算量 RNN参数浮点数计算量 GRU参数…...
【实验笔记】C语言实验——降价提醒机器人
降价提醒机器人 题目: 小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。 输入格式…...
YOLOv5分割训练,从数据集标注到训练一条龙解决
最近进行了分割标注,感觉非常好玩,也遇到了很多坑,来跟大家分享一下,老样子有问题评论区留言,我会的就会回答你。 第一步:准备数据集 1、安装标注软件labelme如果要在计算机视觉领域深入的同学࿰…...
再添千万级罚单,某银行年内罚款过亿!金融行业合规问题亟待解决
11月17日晚间,国家金融监管总局上海监管局披露行政处罚信息显示,某银行因32项违法违规事实收到两张690万元的大额罚单,合计罚款金额达1380万元。但这并不是银行该今年收到的第一张大额罚单。今年4月28日,该行因在结售汇、外币理财…...
配置Nginx服务器用于Web应用代理和SSL{仅配置文件}
在本篇博文中,我们将深入讨论如何配置Nginx服务器,使其成为一个强大的Web应用代理,并通过SSL协议加强通信的安全性。 1. 服务器监听与SSL设置 首先,我们要配置Nginx服务器以监听HTTPS流量并设置SSL证书,确保通信的安…...
【广州华锐互动】VR溺水预防教育:在虚拟世界中学会自救!
在现代社会中,水上安全和救援行动的重要性不言而喻。尤其在自然灾害、游泳事故或航海事故中,有效的救援行动可以挽救许多生命。然而,传统的救援训练往往存在成本高、风险大、效率低等问题。在这样的背景下,虚拟现实(VR…...
Si(111)衬底上脉冲激光沉积AlN外延薄膜的界面反应控制及其机理
引言 通过有效控制AlN薄膜与Si衬底之间的界面反应,利用脉冲激光沉积(PLD)在Si衬底上生长高质量的AlN外延薄膜。英思特对PLD生长的AlN/Si异质界面的表面形貌、晶体质量和界面性能进行了系统研究。 我们研究发现,高温生长过程中形…...
基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管
一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构,该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标,Tiva™C系列架构提供了一个具有FPU的80…...
苹果企业签名失败常见的问题
苹果企业签名失败的常见问题主要有以下几种: 证书过期或无效:苹果开发者需要定期更新他们的签名证书,以确保其有效性。一旦证书过期,相关应用将无法正常工作。证书不匹配:如果使用的证书与应用程序的Bundle ID不匹配&…...
Jtti:Android alertdialog嵌套出错怎么解决
在Android开发中,AlertDialog嵌套可能导致一些问题,例如显示异常或无法关闭对话框等。这通常是由于上一个AlertDialog未被正确关闭,导致下一个AlertDialog无法正常工作。解决这个问题的方法包括: 1. 确保关闭上一个AlertDialog&a…...
解锁word密码,忘记密码怎么办?
想要解密、找回或去除Word文档密码,可以按以下步骤操作:第一步,在百度上搜索【密码帝官网】,接着在用户中心上传需要解密的文件即可。这种方法安全、简单易操作,而且不用下载软件,手机和电脑都可以用。无论…...
同为科技(TOWE)桌面PDU插排:一款可以DIY定制的“超级插座”
当今社会,各种电子产品和家用电器已成为人们日常生活中不可或缺的一部分,在带给人们便利的同时,也使得电力使用变得更加频繁和重要。然而,当前市面上很多普通插座由于功能单一、材质粗劣、插口数量受限、充电速度过慢、插头间互相…...
使用Java Servlet生成动态二维码
文章目录 引入ZXing库创建QRCodeServlet部署到Servlet容器拓展功能1. 动态生成二维码内容2. 调整二维码尺寸3. 错误修正级别4. 日志输出 结语 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&…...
【已解决】微信小程序腾讯地图的map清除markers,setData将marker置空后,安卓和ios还会显示上次的内容的问题所在以及解决办法
问题描述 1.我首先点击了这个marker 2.这里可以看到根据id获取到了他的信息 3.当我滑动了地图,这时候重新加载了markers,我再次点击这个marker 4.会发现获取不到数据了 问题原因 个人猜测引起这个问题的原因是id重叠了,导致获取不到数据&am…...
弄懂Rust编程中的Trait
1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话ÿ…...
关于登山扣亚马逊\SHEIN出口合规标准ASTM F1774 指南解析
登山的时候配合绳子起到一个承重悬挂的作用.采用铝合金、铁或者是不锈钢等材料制作而成的一种登山工具之一。 其形状多样,比较常见的是椭圆形和圆形的,除此之外还有长方形、三角形等样式的登山扣。铝合金登山扣由于质地较轻所以重量也比较轻,…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
