hive数据量不一致,表1是5条,导入到表2,变成了10条

原因:

hive的数据里面,有脏数据,比如某个字段中的数据有换行符、\n

如果hive设置的参数,换行符正好是\n,那么数据就会变多

create external TABLE `dc_temp.ads_equp_relainfo_di` ( `init_date` int COMMENT '数据日期', `op_device` string COMMENT '对应设备标识', `device_type` string COMMENT '关系类型', `client_id_a` string COMMENT 'a客户号', `client_name_a` string COMMENT 'a客户名称', `parent_branch_name_a` string COMMENT 'a所属分公司', `branch_name_a` string COMMENT 'a所属营业部', `emp_no_a` string COMMENT 'a对应员工号', `emp_name_a` string COMMENT 'a员工名称', `relation_type_a` string COMMENT 'a亲属关系', `init_date_detail_a` int COMMENT '发生日期_a客户明细', `op_station_detail_a` string COMMENT '站点信息_a客户明细', `deal_prsn_type_name` string COMMENT '豁免件', `client_id_b` string COMMENT 'b客户号', `client_name_b` string COMMENT 'b客户名称', `employee_bool` int COMMENT 'b是否员工', `emp_name_b` string COMMENT 'b员工名称', `emp_no_b` string COMMENT 'b对应员工号', `branch_name_b` string COMMENT 'b客户所属营业部', `relation_type_b` string COMMENT 'b亲属关系', `parent_branch_name_b` string COMMENT 'b客户所属分公司', `init_date_detail_b` int COMMENT '发生日期_b客户明细', `op_station_detail_b` string COMMENT '站点信息_b客户明细', `source_name_detail_b` string COMMENT '来源中文含义_b客户明细', `source_table_detail_b` string COMMENT '来源_b客户明细', `client_name_detail_b` string COMMENT '客户名称_b客户明细', `branch_no_detail_b` string COMMENT '营业部编号_b客户明细', `fund_account_detail_b` string COMMENT '资金账号_b客户明细', `op_entrust_way_detail_b` string COMMENT '委托方式_b客户明细', `mobile_tel_01_detail_b` string COMMENT '手机号_b客户明细', `stock_code_detail_b` string COMMENT '股票代码_b客户明细', `stock_name_detail_b` string COMMENT '股票名称_b客户明细', `report_bs_detail_b` string COMMENT '申报方向_b客户明细', `entrust_price_detail_b` string COMMENT '委托价格_b客户明细', `entrust_amount_detail_b` string COMMENT '委托数量_b客户明细', `business_balance_detail_b` string COMMENT '成交金额_b客户明细', `clear_balance_detail_b` string COMMENT '清仓金额_b客户明细', `remark_detail_b` string COMMENT '备注_b客户明细', `position_str_detail_b` string COMMENT '定位串_b客户明细', `col1` string COMMENT '备用1', `col2` string COMMENT '备用2', `col3` string COMMENT '备用3', `col4` string COMMENT '备用4', `col5` string COMMENT '备用5', `col6` string COMMENT '备用6', `update_time` string COMMENT '更新时间' ) COMMENT '合规设备站点' PARTITIONED BY (`busi_date` string COMMENT '日分区') ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' STORED AS parquet TBLPROPERTIES ('creator'='qirp', 'created_date'='2025-02-28'); 我想把device_type加入到分区字段中,该如何操作
最新发布
04-04
<think>好的,用户想要将device_type字段添加到现有的分区字段中。原来的已经有一个分区字段busi_date,现在需要加上device_type。首先,我需要回忆一下Hive中如何修改分区字段。记得Hive支持直接修改分区字段,必须重新建。那用户用的是外部,所以还要注意数据存储的位置问题。 接下来,用户提供的建语句中有PARTITIONED BY (busi_date string),现在要改成PARTITIONED BY (busi_date string, device_type string)。过,原来的device_type是普通字段,现在要作为分区字段,所以建时需要将它从普通字段中移除,否则会出现重复列的错误。需要检查原来的字段列,确认device_type是否存在。用户提供的结构里确实有device_type字段,所以在新的建语句中需要删除这个字段,并移到分区部分。 然后,存储路径方面,分区结构会变化,原来的分区可能只有busi_date=xxx,现在需要变成busi_date=xxx/device_type=xxx。用户需要调整数据的分区目录结构,或者重新导入数据到新的分区中。因为是外部,可能需要使用ALTER TABLE语句添加分区,或者使用MSCK REPAIR TABLE来修复分区,但具体操作可能因数据存储方式而异。 还要考虑数据迁移的问题。用户可能需要将旧数据按照新的分区字段重新组织目录,或者使用INSERT OVERWRITE将数据插入到新中,同时指定busi_date和device_type的值。但需要注意,外部的数据会被自动删除,所以可能需要手动管理旧数据。 另外,属性中的STORED AS parquet和行列分隔符可能也需要检查,过因为使用Parquet格式,FIELDS TERMINATED BY可能会影响,但最好保持一致。同时,修改后的需要确保所有依赖该的查询或作业更新为新的分区结构。 最后,提醒用户备份数据,测试新结构,确保应用兼容性。可能还需要处理历史数据的分区迁移,确保查询时能正确访问到按新分区存储的数据。</think>需要将`device_type`字段加入分区字段时,需通过重建外部实现。以下是分步操作说明: --- ### 一、核心原理 在Hive中,**分区字段能直接修改**,必须通过以下流程: 1. 创建新结构(包含目标分区字段) 2. 迁移旧数据到新分区结构 3. 删除旧(可选) 4. 重命名新(可选) --- ### 二、具体操作步骤 #### 1. 修改结构 将原`device_type`字段**从普通列移动到分区列**,同时保留原有`busi_date`分区: ```sql CREATE EXTERNAL TABLE `dc_temp.ads_equp_relainfo_di_new` ( `init_date` int COMMENT '数据日期', `op_device` string COMMENT '对应设备标识', -- 注意:这里删除了原device_type字段的定义(已移至分区列) -- `client_id_a` string COMMENT 'a客户号', ... -- 其他字段保持原样 `col6` string COMMENT '备用6', `update_time` string COMMENT '更新时间' ) COMMENT '合规设备站点' PARTITIONED BY ( `busi_date` string COMMENT '日分区', `device_type` string COMMENT '关系类型' -- 新增分区字段 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' STORED AS parquet LOCATION '/your/path' -- 必须指定新存储路径,避免覆盖旧数据 TBLPROPERTIES ('creator'='qirp', 'created_date'='2025-02-28'); ``` #### 2. 数据迁移 使用动态分区插入数据: ```sql INSERT OVERWRITE TABLE dc_temp.ads_equp_relainfo_di_new PARTITION (busi_date, device_type) SELECT init_date, op_device, -- 这里再select原device_type字段(已作为分区参数) -- client_id_a, ..., busi_date, -- 原分区字段 device_type -- 新增分区字段 FROM dc_temp.ads_equp_relainfo_di; -- 原 ``` #### 3. 验证与切换 ```sql -- 验证数据量 SELECT COUNT(1) FROM dc_temp.ads_equp_relainfo_di_new; -- 重命名(可选) ALTER TABLE dc_temp.ads_equp_relainfo_di RENAME TO ads_equp_relainfo_di_old; ALTER TABLE dc_temp.ads_equp_relainfo_di_new RENAME TO ads_equp_relainfo_di; ``` --- ### 三、注意事项 1. **存储路径分离**:新必须使用新的HDFS路径,避免与旧数据冲突 2. **分区目录结构**:新分区字段会产生嵌套目录,例如: ``` /your/path/busi_date=20231001/device_type=MOBILE ``` 3. **查询兼容性**:原有按`device_type`做WHERE件的查询需要改为分区过滤 4. **外部特性**:删除会删除数据文件,需手动清理旧数据 --- ### 四、补充说明 如果使用AWS Glue或Hive Metastore,建议通过`MSCK REPAIR TABLE`修复分区元数据: ```sql MSCK REPAIR TABLE dc_temp.ads_equp_relainfo_di_new; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值