【Hive】从长格式表到宽格式表的转换

本文介绍了长格式数据和宽格式数据的概念,以电商数据库客户信息表为例,阐述将长格式数据转化为宽格式数据的需求。实现思路是先将客户信息转化为map格式数据,再提取key与value。还给出了实现代码,同时提到也可用case when和left join函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

    使用sql代码作分析的时候,几次遇到需要将长格式数据转换成宽格式数据,一般使用left join或者case when实现,代码看起来冗长,探索一下,可以使用更简单的方式实现长格式数据转换成宽格式数据。


长宽格式数据

举个栗子

640?wx_fmt=png

宽格式数据:每个变量单独成一列为宽格式数据,例如变量name、age等。

长格式数据:长数据中变量的ID没有单独列成一列,而是整合在同一列。


需求描述

    某电商数据库中存在一张客户信息表user_info,记录着客户属性数据和消费数据,需要将左边长格式数据转化成右边宽格式数据。

640?wx_fmt=png


需求实现

做以下说明

640?wx_fmt=png


当然,其他数据库语句可以同等替换上面的函数。


需求实现思路

步骤一:将客户信息转化成map格式的数据

u001  {"age":"25","education":"master","first_buytime":"2018/1/3","name":"Sulie","regtime":"2018/1/2","sex":"male"}	
u002  {"age":"30","education":"Bachelor","first_buytime":"2018/5/5","name":"LuBan","regtime":"2018/3/4","sex":"male"}	
u003  {"age":"27","education":"PhD","first_buytime":"2018/5/4","name":"ZhenJi","regtime":"2018/4/3","sex":"female"}


步骤二:将map格式数据中的key与value提取出来,key就是每一列变量名,value就是变量值

user_no  name    sex   age  education  regtime  first_buytime	
u001    Sulie   male    25   master    2018/1/2  2018/1/3	
u002    LuBan   male    30   Bachelor  2018/3/4  2018/5/5	
u003    ZhenJi  female  27      PhD    2018/4/3  2018/5/4


需求实现代码

步骤一实现

select	
     user_no,	
     str_to_map(concat_ws(',',collect_set(concat_ws(':', message, detail)))) message1	
     from user_info	
     group by user_no	
     order by user_no

    

    collect_set形成的集合是无序的,若想得到有序集合,可以使用sort_array对集合元素进行排序。


select	
     user_no,	
     str_to_map(concat_ws(',',sort_array(collect_set(concat_ws(':', message, detail))))) message1	
     from user_info	
     group by user_no	
     order by user_no


    上面代码用到了字符串连接函数、集合函数、排序函数以及字符串转化成map格式函数,可以每一步运行出来查看结果更容易理解。


步骤二实现

select 	
    user_no,	
    message1['name'] name,	
    message1['sex'] sex,	
    message1['age'] age,	
    message1['education'] education,	
    message1['regtime'] regtime,	
    message1['first_buytime'] first_buytime	
from 	
  (select	
      user_no,	
      str_to_map(concat_ws(',',collect_set(concat_ws(':', message, detail)))) message1	
      from user_info	
      group by user_no	
      order by user_no	
   ) a


上面代码就是提取map格式数据中的key与value,即列名['key']得到value值。

总结

    长格式数据转换成宽格式数据,首先将数据转化成map格式数据,然后使用列名['key']得到每一个key的value。当然,也可以使用case when函数实现以及left join函数实现。


<think>首先,用户的问题是:在Hive中搭建数据仓库架构,对接HDFS中原始数据,执行数据清洗任务,包括空值处理、格式标准化、异常检测(如极端值剔除)、日期字段转换等流程,并构建分析型。我需要用中文回答问题。回答完后,必须提出3-5个相关问题。这些相关问题必须以“§§相关问题§§”开头,并且是完整的一行。然后列出3-5个问题,每个问题用数字点开头,比如“1.···”。关键点: -回答必须完整。 -末尾必须有“§§相关问题§§”,然后是相关问题列。-禁止换行分散输出,意思是相关问题应该紧凑输出。现在,构建我的回答:1.**理解问题**:用户询问如何在Hive中搭建数据仓库,对接HDFS数据,执行数据清洗(空值处理、格式标准化、异常检测、日期转换),并构建分析型。 2. **回答结构**:-先解释整体流程。-然后分步描述:搭建架构、对接数据、清洗任务、构建。-提供一些示例代码或命令,因为示例中显示了Python代码。3.**使用中文**:所有内容用中文。4.**末尾相关问题**:提出3-5个相关问题。相关问题应基于用户的问题和我的回答。例如,关于优化、特定函数、错误处理等。 **步骤分解**:- **搭建数据仓库架构**:在 Hive中创建数据库、等。 -**对接HDFS原始数据**:使用外部指向HDFS位置。 -**数据清洗任务**:-空值处理:使用COALESCE、CASE WHEN等处理 NULL。-格式标准化:如字符串转换、日期格式化。-异常检测:使用 WHERE子句或UDFs剔除极端值。-日期字段转换:使用日期函数如TO_DATE、DATE_FORMAT。 -**构建分析型**:创建新或视图,整合清洗后的数据,可能使用JOINs或聚合。**提供代码示例**:由于示例中有Python代码,我应该提供Hive SQL示例。例如: -创建外部。 -执行清洗的SQL查询。 -创建。 **相关问题**:提出3-5个。例如:1.如何优化 Hive查询性能? 2.如何处理海量数据时的清洗效率?3.在Hive中使用哪些函数处理日期? 4.如何监控清洗过程?5.构建时有哪些最佳实践? 确保回答完整。**最终输出结构**:-回答内容。 -一行“§§相关问题§§”。-然后1.2.3. ...相关问题。</think>在 Hive 中搭建数据仓库架构并执行数据清洗任务,涉及多个步骤:首先创建数据仓库架构(包括数据库和),然后对接 HDFS 原始数据,执行清洗流程(如空值处理、格式标准化、异常检测和日期转换),最后构建分析型。以下是详细流程和示例代码: ### 1. **搭建数据仓库架构** - 在 Hive 中创建数据库和结构,使用外部(External Table)指向 HDFS 存储位置,确保数据不重复存储。 - 示例:创建外部对接 HDFS 原始数据。 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS dw; USE dw; -- 创建外部指向 HDFS 路径(假设路径为 '/user/hive/raw_data') CREATE EXTERNAL TABLE IF NOT EXISTS raw_data ( id INT, name STRING, value DOUBLE, date_string STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/raw_data'; ``` ### 2. **执行数据清洗任务** - **空值处理**:使用 `COALESCE` 或 `CASE WHEN` 填充或过滤 NULL 值。 - **格式标准化**:使用 `LOWER()`, `UPPER()` 或 `REGEXP_REPLACE()` 统一格式(如字符串大小写)。 - **异常检测**:通过 `WHERE` 子句剔除极端值(如基于标准差或范围过滤)。 - **日期字段转换**:使用 `TO_DATE()` 或 `DATE_FORMAT()` 将字符串为标准日期格式。 - 示例:创建一个临时视图或执行清洗。 ```sql -- 创建清洗后的视图 CREATE VIEW cleaned_data AS SELECT id, COALESCE(name, 'Unknown') AS cleaned_name, -- 空值处理:填充为 'Unknown' LOWER(REGEXP_REPLACE(value, '[^0-9.]', '')) AS standardized_value, -- 格式标准化:移除非数字字符并为小写 CASE WHEN value < 0 OR value > 100 THEN NULL -- 异常检测:剔除超出 0-100 范围的极端值 ELSE value END AS filtered_value, TO_DATE(date_string, 'yyyy-MM-dd') AS converted_date -- 日期转换:字符串日期 FROM raw_data WHERE date_string IS NOT NULL; -- 过滤空日期 ``` ### 3. **构建分析型** - 基于清洗后的数据,创建(Wide Table)整合多个维度,便于分析。使用 `CREATE TABLE AS SELECT` (CTAS) 或插入到新。 - 示例:构建,聚合数据并添加衍生字段。 ```sql -- 创建,整合清洗结果 CREATE TABLE analysis_wide_table AS SELECT id, cleaned_name, AVG(filtered_value) OVER (PARTITION BY cleaned_name) AS avg_value, -- 聚合分析 converted_date, YEAR(converted_date) AS year -- 衍生日期字段 FROM cleaned_data; ``` ### 关键注意事项 - **性能优化**:在大数据场景下,使用分区(`PARTITIONED BY`)和分桶(`CLUSTERED BY`)加速查询。 - **错误处理**:在清洗中,添加 `TRY_CAST()` 或自定义 UDF 处理转换错误。 - **监控**:通过 Hive 日志或工具(如 Apache Atlas)跟踪任务状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值