Hive dayofweek函数在ETL任务中的应用方法
时间:2026-06-27 06:51
在Hive里处理日期字段时,dayofweek()函数绝对是个高频好用的工具——它能直接返回某个日期或时间戳对应的星期几。对于ETL流程来说,这招经常用在数据清洗、分类汇总或者业务分析中,比如区分工作日和周末、统计峰值流量、做周同比等。下面这张图就是一个典型的应用场景示意: 那么,这个函数在ETL里
在Hive里处理日期字段时,
dayofweek()函数绝对是个高频好用的工具——它能直接返回某个日期或时间戳对应的星期几。对于ETL流程来说,这招经常用在数据清洗、分类汇总或者业务分析中,比如区分工作日和周末、统计峰值流量、做周同比等。下面这张图就是一个典型的应用场景示意:

那么,这个函数在ETL里到底怎么落地呢?来看几个实际例子。
先讲最简单的:提取星期几。假设你有一张订单表,里面有个日期字段
date_column,想看看每天到底是一周中的第几天,直接用这个查询就行:
SELECT dayofweek(date_column) AS day_of_weekFROM your_table;
返回的数字1到7分别对应周日到周六(注意,Hive里默认周日是1,周一为2,以此类推)。
接下来是过滤场景:如果你只想处理周一的数据(比如某些营销活动只在周一跑),可以结合
CASE语句来实现。下面这个写法把星期几等于1的行标记为1,其余为0,再筛选出等于1的行——当然,更直接的做法是用
WHERE dayofweek(date_column) = 2,但用
CASE的方式在复杂逻辑里会更灵活:
SELECT *FROM your_tableWHERE CASEWHEN dayofweek(date_column) = 1 THEN 1ELSE 0END = 1;
再一个常用需求:把数字转成直观的星期名称。比如下游报表系统需要显示“Monday”而不是“2”,那就用
CASE做个映射:
SELECT date_column, CASE dayofweek(date_column) WHEN 1 THEN 'Sunday' WHEN 2 THEN 'Monday' WHEN 3 THEN 'Tuesday' WHEN 4 THEN 'Wednesday' WHEN 5 THEN 'Thursday' WHEN 6 THEN 'Friday' WHEN 7 THEN 'Saturday' END AS day_nameFROM your_table;
最后,看看如何把这些逻辑嵌入真实的ETL流水线。如果你在用Apache Airflow编排任务,可以定义一个DAG,把上述几个查询拆成独立步骤:先提取星期几、再过滤指定星期、最后转换名称。下面的示例代码展示了三个依次执行的任务,它们都用
HiveOperator执行对应的HQL:
from airflow import DAGfrom airflow.providers.hive.operators.hive_operator import HiveOperatorfrom datetime import datetime, timedeltadefault_args = {'owner': 'airflow','depends_on_past': False,'start_date': datetime(2023, 1, 1),'email': ['youremail@example.com'],'email_on_failure': False,'email_on_retry': False,'retries': 1,'retry_delay': timedelta(minutes=5),}dag = DAG('hive_dayofweek_etl',default_args=default_args,description='An example DAG to extract day of week using Hive',schedule_interval=timedelta(days=1),)t1 = HiveOperator(task_id='extract_dayofweek',hive_cli_conn_id='hive_default',query="""SELECT dayofweek(date_column) AS day_of_weekFROM your_table;""",dag=dag,)t2 = HiveOperator(task_id='filter_mondays',hive_cli_conn_id='hive_default',query="""SELECT *FROM your_tableWHERE dayofweek(date_column) = 1;""",dag=dag,)t3 = HiveOperator(task_id='convert_dayofweek',hive_cli_conn_id='hive_default',query="""SELECT date_column, CASE dayofweek(date_column) WHEN 1 THEN 'Sunday' WHEN 2 THEN 'Monday' WHEN 3 THEN 'Tuesday' WHEN 4 THEN 'Wednesday' WHEN 5 THEN 'Thursday' WHEN 6 THEN 'Friday' WHEN 7 THEN 'Saturday' END AS day_nameFROM your_table;""",dag=dag,)t1 >> t2 >> t3
可以看到,
dayofweek()在ETL中的用法非常灵活:提取、过滤、转换,再加上调度系统的配合,就能轻松把日期维度处理得井井有条。实际业务中还可以结合分组聚合、窗口函数做更复杂的统计分析,但打好这块基础是第一步。