Amgen Data Engineer面试题和答案
Amgen Data Engineer面试题和答案 (English Translation Coming Soon)
这家的面试流程真的让我无语,从海投到捞我起来都快两个月了,我还以为我简历早就石沉大海了。结果突然一个电话过来,HR小姐姐声音倒是很甜,但一上来就问我什么时候有空,说要安排一个technical phone screen。我当时还在图书馆赶due,整个人都懵了。说实话,Amgen这种大药厂,我本来也没抱太大希望,毕竟我一个New Grad,没啥惊天动地的项目经验。
好不容易约好了下周的phone screen,结果面试官迟到了十分钟,我一个人对着屏幕尴尬地等。面试官是个印度大叔,口音有点重,不过人还挺nice的。问了一些简历上的东西,然后就开始上强度了。上来就是一道SQL题,还好我刷题还算勤快,磕磕绊绊地答上来了。然后又问了几个Python的知识点,比如generator和decorator的区别,还让我现场写一个简单的function。整个过程大概40分钟,感觉自己答得一般般,面完就觉得凉了。
结果过了两天,HR又来邮件了,说我过了phone screen,要约virtual Onsite。我当时的心情,怎么说呢,就是那种“我竟然还没挂?”的惊喜。Onsite是连续三轮,每轮45分钟,中间没有休息。第一个是hiring manager,第二个是两个senior Data Engineer,第三个是另一个team的manager。不得不说,这个强度真的很大,面完我感觉身体被掏空。
下面给大家分享一下我还记得的一些面试题,希望能帮到后面面试的同学。
第一题:SQL - 药品销售数据分析
给你两个table,一个是sales,记录了每笔销售的药品ID、销售日期和销售额;另一个是drugs,记录了药品ID、药品名称和所属类别。让你写一个SQL query,找出2024年上半年每个药品类别的总销售额,并按销售额从高到低排序。
这题其实不难,主要考察SQL的基本功,特别是JOIN和GROUP BY的使用。我当时是这么写的:
SELECT d.category, SUM(s.sales_amount) AS total_sales FROM sales s JOIN drugs d ON s.drug_id = d.drug_id WHERE s.sale_date >= '2024-01-01' AND s.sale_date < '2025-07-01' GROUP BY d.category ORDER BY total_sales DESC;
写完之后,面试官还追问了一些问题,比如如果数据量很大,这个query怎么优化。我就提到了可以在sale_date和drug_id上加index,来加快JOIN和WHERE的速度。他还问了关于window function的应用场景,比如我想看每个类别里销售额最高的药品,就可以用ROW_NUMBER()或者RANK()。
第二题:Python - 数据清洗
给你一个pandas DataFrame,里面有一列是'dosage',记录了药品的剂量,但是格式很乱,比如'10mg', '20 ml', '5g'等等。让你写一个Python function,把这一列清洗干净,统一单位成mg。
这题考察的是Python的string manipulation和regular expression。踩过坑的人都知道,这种数据清洗的活儿,在实际工作中特别常见。我当时用了一个apply a lambda function的方法,结合regex来提取数字和单位。
import pandas as pd
def clean_dosage(df): def convert_to_mg(dosage_str): if isinstance(dosage_str, str): dosage_str = dosage_str.lower() num = float(re.findall(r'\d+.?\d*', dosage_str)[0]) if 'g' in dosage_str: return num * 1000 elif 'ml' in dosage_str: # 假设 1ml = 1mg return num else: return num return None
df['dosage_mg'] = df['dosage'].apply(convert_to_mg)
return df
面试官看了我的代码,点了点头,然后问我如果单位的种类非常多,有没有更scalable的方法。我就说可以建一个conversion map,把所有可能的单位和换算系数都存进去,这样以后有新的单位也方便扩展。这个小小的follow-up,感觉给自己加了不少分。
第三题:Data Modeling - 设计一个临床试验数据模型
让你为一个新的临床试验设计一个简单的Data Model,需要存储患者信息、试验药物、给药记录和不良反应事件。你会怎么设计Schema?
这题就比较开放了,主要考察对Schema Design的理解。我当时画了一个简单的ER图,设计了四个主要的table:Patients, Drugs, DosingRecords, AdverseEvents。Patients table里有patient_id, age, gender等基本信息。Drugs table里有drug_id, drug_name。DosingRecords table是一个linking table,有patient_id, drug_id, dosing_time, dosage。AdverseEvents table也有patient_id, event_type, event_time。我还特意强调了primary key和foreign key的设置,来保证data integrity。
面试官追问,如果一个患者可能同时参与多个试验,或者服用多种药物,我的模型要怎么调整。我说可以在DosingRecords里加一个trial_id,来区分不同的试验。对于多种药物,目前的模型已经可以支持了,因为DosingRecords里每次给药都是一条新记录。他还问了关于Data Warehouse和Data Lake的选择,我说对于这种structured data,用传统的Data Warehouse可能更合适,因为可以更好地支持ad-hoc query和reporting。
第四题:ETL/Data Pipeline
描述一下你理解的ETL过程。如果你要设计一个每天从多个源系统(比如医院的EHR系统)抽取数据,然后加载到Data Warehouse的Data Pipeline,你会考虑哪些关键点?
这题是典中典了,基本上Data Engineer面试必考。我先解释了ETL是Extract, Transform, Load的缩写。然后结合一个具体的场景,比如从EHR系统里抽数据,讲了我的设计思路。我说我会用Airflow来做workflow orchestration,每天定时触发ETL Job。Extract阶段,我会用API或者直接连数据库的方式去拿数据。Transform阶段,我会用Spark来做大规模的数据转换,比如数据清洗、格式统一、业务逻辑计算等。Load阶段,我会把处理好的数据写入到AWS Redshift这样的Data Warehouse里。我还提到了error handling和monitoring的重要性,比如要设置alert,当pipeline失败的时候能及时收到通知。
第五题:Behavioral Question
讲一个你遇到的最challenging的技术难题,你是怎么解决的?
BQ题也是必不可少的环节。我讲了一个之前在学校项目里遇到的问题,当时我们的Data Pipeline在处理一个很大的数据集时,经常因为内存不足而失败。我先是通过logging和monitoring定位到是Spark的某个transformation操作导致的OOM。然后我尝试了多种优化方法,比如增加partition数量来提高并行度,用cache()来缓存中间结果,以及用更高效的数据结构。最后发现是因为一个join操作导致了data skew,我就用了salting的方法来解决。我着重强调了自己是如何一步步分析问题、寻找解决方案,并最终解决问题的过程。
总的来说,Amgen的面试还是挺有挑战的,既考察了technical的深度,也考察了解决问题的能力。虽然流程有点折磨人,但不得不说,面试官的水平都很高,问的问题也都很实在,不是那种为了考你而考你的偏题怪题。
这次面试经历也让我反思了很多。以前总觉得刷题就是一切,但其实对于Data Engineer这个岗位来说,对整个Data Pipeline的理解,以及解决实际问题的能力,可能比单纯会写一个复杂的SQL或者算法更重要。像Data Modeling, Schema Design, ETL workflow这些东西,在面试中占的比重越来越大。还有就是cloud platform的经验,特别是AWS,现在基本上是DE的标配了。
希望我的这点经验能帮到大家吧。求职季都不容易,一起加油!
#北美求职 #数据工程师 #DataEngineer #面试经验 #Amgen #药厂 #NG #newgrad #SQL #Python
