``` SELECT P6.name task_name, P7.name task_type, P8.name principal_role, P9.name principal, P6.standard_work_hour, P6.has_output_package is_delivery_stuff, P3.name task_state, P6.predecessor front_task, P6.plan_starttime, P6.plan_endtime, P6.real_starttime, P6.real_endtime, P6.real_duration, P4.name task_department, P10.name delivery_name, p6.publish_time, P6.wfstate flow_state, P6.code task_code, P6.task_grade, P6.important_task, CURRENT_TIMESTAMP() edit_time FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 P6 LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_task_type_17010_dev15oc_1054010535 P7 ON P6.type_id = P7.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_role_17010_dev15oc_1054010535 P8 ON P6.principal_role = P8.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_bd_staff_17010_dev15oc_1054480385 P9 ON P6.principal = P9.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_base_lc_st_17010_dev15oc_1054010535 P3 ON P6.lifecycle_attrpool_id = P3.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_org_admin_17010_dev15oc_1054480402 P4 ON P6.principal_dept = P4.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_prj_t_dt_17010_dev15oc_1054010535 P10 ON P6.id = P10.taskid```根据以上代码字段建一张hive表,注意HIVE里只保留四种字段类型,分别是STRING、BIGINT、DOUBLE、Decimal
时间: 2025-07-08 07:20:33 浏览: 10
<think>嗯,用户给了我一个SQL查询的代码,然后让我根据这个代码在Hive里建表,而且Hive里只能使用STRING、BIGINT、DOUBLE和Decimal这四种类型。首先,我需要仔细分析这个SQL查询中的各个字段,然后确定每个字段对应的数据类型。
首先,我需要查看每个字段的来源表,以及它们在原表中的数据类型。不过用户可能没有给出原表的结构,所以可能需要根据字段名和常见的命名习惯来推断类型。比如,像name这样的字段通常是字符串,而像standard_work_hour可能是一个数值类型,可能是整数或者小数。用户提到Hive只能用四种类型,所以数值类型需要判断是BIGINT、DOUBLE还是Decimal。
接下来,我需要处理LEFT JOIN的部分。每个LEFT JOIN关联的表可能会有不同的字段,但这里用户只是从这些表中选择了name字段,比如P7.name作为task_type,P8.name作为principal_role,等等。这些name字段应该都是STRING类型。
然后,看主表P6中的字段,比如code、task_grade、important_task这些。code可能是一个字符串,task_grade可能是整数,但要看是否有小数。比如,task_grade如果是等级,可能用整数,比如1,2,3,所以可能用BIGINT。important_task可能是个布尔值,但Hive没有布尔类型,所以可能用STRING,比如'Y'/'N',或者转成BIGINT的0/1。但用户没有说明,可能需要保持原样,用STRING。
时间相关的字段,比如plan_starttime、plan_endtime等,在Hive中通常用TIMESTAMP类型,但用户要求只能用四种类型,所以可能需要转换为STRING来存储时间格式。或者如果原字段是时间戳,可能用BIGINT存储Unix时间戳,但这里用户可能希望保持原格式,所以用STRING更保险。
数值类型的字段需要特别注意,比如standard_work_hour可能代表工时,可能是小数,所以用Decimal或者DOUBLE。如果有精度要求,比如需要保留两位小数,应该用Decimal(10,2),否则用DOUBLE也可以。real_duration如果是持续时间,可能是整数小时数,所以用BIGINT,或者可能是小数,所以需要确认。
has_output_package这个字段,原代码中是is_delivery_stuff,可能是一个布尔值,但同样,Hive没有布尔类型,所以可能转换为STRING,比如'true'/'false',或者用BIGINT的1/0。不过原字段名中有is,可能原表是布尔,但转换到Hive时用STRING。
另外,像publish_time和edit_time这样的时间字段,同样需要处理为STRING。CURRENT_TIMESTAMP()在Hive中生成的是时间戳,但根据规则,需要转成STRING或者BIGINT。不过用户可能希望保留日期格式,所以用STRING。
接下来,我需要逐个检查每个字段:
- task_name (P6.name):STRING
- task_type (P7.name):STRING
- principal_role (P8.name):STRING
- principal (P9.name):STRING
- standard_work_hour:可能是小时数,比如8.5小时,所以用Decimal(10,2)或者DOUBLE。根据用户需求,如果有小数位,用Decimal更合适。
- is_delivery_stuff (P6.has_output_package):可能原字段是布尔,转换为STRING,比如'true'/'false',或者用BIGINT的1/0。但用户示例中没有说明,所以可能保持原样,可能原字段是INT或类似类型,所以可能需要用BIGINT,但如果是字符串的话,就用STRING。需要看原表结构,但用户没有给出,可能需要根据字段名猜测。比如has_output_package可能是标记是否有输出包,可能用1/0,所以BIGINT。
- task_state (P3.name):STRING
- front_task (P6.predecessor):如果predecessor存储的是任务ID,可能是STRING或者BIGINT。但原字段名是predecessor,可能关联到其他任务的code或ID,如果是数字,可能是BIGINT,否则STRING。需要看具体情况,但可能用STRING更安全,比如如果有字母数字组合。
- plan_starttime,plan_endtime,real_starttime,real_endtime:时间类型,转为STRING。
- real_duration:持续时间,可能是小时数,整数或小数,所以BIGINT或Decimal。比如如果是按小时计算,整数的话用BIGINT,否则Decimal。
- task_department (P4.name):STRING
- delivery_name (P10.name):STRING
- publish_time:时间,STRING。
- flow_state (P6.wfstate):可能是一个状态码,如字符串或数字。原字段名wfstate可能表示工作流状态,可能用STRING,比如'active', 'completed',或者状态代码用BIGINT。需要看具体情况,但根据关联到P3.name是task_state,所以可能wfstate是代码,而P3.name是状态名称。例如,如果wfstate是数字ID,则用BIGINT,否则STRING。但原表P6中的wfstate可能存储的是代码,比如字符串,所以用STRING。
- task_code (P6.code):通常code是字符串,如'TASK001',所以STRING。
- task_grade:等级,可能是整数,所以BIGINT。
- important_task:可能存储的是标记是否为重要任务,可能用1/0,所以BIGINT。
- edit_time:CURRENT_TIMESTAMP()生成的时间,转为STRING。
现在需要确认每个字段对应的Hive类型:
- 所有name字段都是STRING。
- standard_work_hour:可能需要Decimal,比如DECIMAL(10,2)。
- has_output_package (is_delivery_stuff):如果原字段是布尔,可能用BIGINT(1/0),但如果是字符串如'Y'/'N'则用STRING。用户示例中的字段是is_delivery_stuff,可能希望用STRING,但需要确认。假设原字段是INT类型(1/0),则转为BIGINT。
- real_duration:可能存储的是实际耗时,比如小时数,可能是整数或小数,所以用DECIMAL(10,2)。
- wfstate:可能用STRING,例如状态代码如'RUNNING',但如果是数字则用BIGINT。假设是字符串。
- task_grade:BIGINT。
- important_task:BIGINT(1/0)。
现在需要整理所有字段的类型:
task_name STRING,
task_type STRING,
principal_role STRING,
principal STRING,
standard_work_hour DECIMAL(10,2),
is_delivery_stuff BIGINT,
task_state STRING,
front_task STRING,
plan_starttime STRING,
plan_endtime STRING,
real_starttime STRING,
real_endtime STRING,
real_duration DECIMAL(10,2),
task_department STRING,
delivery_name STRING,
publish_time STRING,
flow_state STRING,
task_code STRING,
task_grade BIGINT,
important_task BIGINT,
edit_time STRING
不过需要确认是否有其他字段可能需要调整。例如,standard_work_hour是否有可能是整数,比如BIGINT?如果原数据中没有小数,可以,但如果有小数位,必须用Decimal或DOUBLE。同理,real_duration如果是整数小时,可以用BIGINT,否则Decimal。
另外,对于Decimal类型,需要指定精度和小数位数。如果用户没有明确说明,可以假设为DECIMAL(10,2)作为通用选择。
所以最终的建表语句应该是这样的,将所有时间字段转为STRING,数值字段根据情况用BIGINT、Decimal,其他字符串用STRING。例如:
CREATE TABLE IF NOT EXISTS table_name (
task_name STRING,
task_type STRING,
principal_role STRING,
principal STRING,
standard_work_hour DECIMAL(10,2),
is_delivery_stuff BIGINT,
task_state STRING,
front_task STRING,
plan_starttime STRING,
plan_endtime STRING,
real_starttime STRING,
real_endtime STRING,
real_duration DECIMAL(10,2),
task_department STRING,
delivery_name STRING,
publish_time STRING,
flow_state STRING,
task_code STRING,
task_grade BIGINT,
important_task BIGINT,
edit_time STRING
)
STORED AS ORC; -- 或者其他存储格式,用户没说,默认可能用TEXTFILE,但通常ORC更常见。
但用户可能希望指定存储格式,但问题中没有提到,所以可能不需要。此外,可能需要添加COMMENT,但用户也没有要求。
最后,要确保没有使用其他类型,比如TIMESTAMP,全部转换为允许的四种类型。例如,所有时间相关的字段都用STRING。</think>根据您的需求,我们将按照以下步骤构建HIVE表:
-----
### **步骤1:字段类型映射**
根据HIVE的4种允许类型,映射规则如下:
```
STRING:所有文本、名称、编码、时间戳字符串
BIGINT:整数型数据(如状态码、是否类字段)
DOUBLE:非精确数值(如工时的小数部分)
DECIMAL:精确数值(需指定精度,假设默认DECIMAL(10,2))
```
-----
### **步骤2:字段类型分析**
原始SQL字段与HIVE类型对应关系:
| 字段名 | 原字段来源 | 映射类型 | 映射依据 |
|---------------------|---------------------|----------------|--------------------------------------------------------------------------|
| task_name | P6.name | STRING | 名称类文本 |
| task_type | P7.name | STRING | 类型描述文本 |
| principal_role | P8.name | STRING | 角色名称文本 |
| principal | P9.name | STRING | 人员名称文本 |
| standard_work_hour | P6.standard_work_hour | DECIMAL(10,2) | 精确工时(通常保留两位小数) |
| is_delivery_stuff | P6.has_output_package | BIGINT | 是否类字段(0/1) |
| task_state | P3.name | STRING | 状态名称文本 |
| front_task | P6.predecessor | STRING | 任务编码一般为字符串 |
| plan_starttime | P6.plan_starttime | STRING | 时间戳按字符串存储 |
| plan_endtime | P6.plan_endtime | STRING | 同上 |
| real_starttime | P6.real_starttime | STRING | 同上 |
| real_endtime | P6.real_endtime | STRING | 同上 |
| real_duration | P6.real_duration | DECIMAL(10,2) | 精确持续时间(保留两位小数) |
| task_department | P4.name | STRING | 部门名称文本 |
| delivery_name | P10.name | STRING | 交付物名称文本 |
| publish_time | P6.publish_time | STRING | 时间戳按字符串存储 |
| flow_state | P6.wfstate | STRING | 工作流状态通常为文本编码 |
| task_code | P6.code | STRING | 任务编码一般为字符串 |
| task_grade | P6.task_grade | BIGINT | 任务等级通常为整数 |
| important_task | P6.important_task | BIGINT | 是否重要任务(0/1) |
| edit_time | CURRENT_TIMESTAMP() | STRING | 当前时间戳按字符串存储 |
-----
### **步骤3:建表语句**
```sql
CREATE TABLE IF NOT EXISTS prj_task_detail (
task_name STRING COMMENT '任务名称',
task_type STRING COMMENT '任务类型',
principal_role STRING COMMENT '负责人角色',
principal STRING COMMENT '负责人',
standard_work_hour DECIMAL(10,2) COMMENT '标准工时',
is_delivery_stuff BIGINT COMMENT '是否有交付物(0否1是)',
task_state STRING COMMENT '任务状态',
front_task STRING COMMENT '前置任务编码',
plan_starttime STRING COMMENT '计划开始时间',
plan_endtime STRING COMMENT '计划结束时间',
real_starttime STRING COMMENT '实际开始时间',
real_endtime STRING COMMENT '实际结束时间',
real_duration DECIMAL(10,2) COMMENT '实际持续时间',
task_department STRING COMMENT '责任部门',
delivery_name STRING COMMENT '交付物名称',
publish_time STRING COMMENT '发布时间',
flow_state STRING COMMENT '流程状态',
task_code STRING COMMENT '任务编码',
task_grade BIGINT COMMENT '任务等级',
important_task BIGINT COMMENT '是否重点任务(0否1是)',
edit_time STRING COMMENT '最后编辑时间'
)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");
```
-----
### **关键设计说明**
1. **时间字段处理**:所有时间相关字段统一存储为STRING类型,保留原始格式(如`2023-01-01 10:00:00`),避免时区转换问题
2. **布尔值转换**:`is_delivery_stuff`和`important_task`映射为BIGINT(0/1),兼容HIVE无BOOLEAN类型的限制
3. **数值精度控制**:工时类字段使用`DECIMAL(10,2)`确保计算精度,避免浮点误差
4. **存储优化**:使用ORC格式+SNAPPY压缩,提升查询性能并减少存储空间
需要调整精度或字段逻辑时可进一步补充业务规则。
阅读全文
相关推荐


















