hive 修改某个库下所有表的特定字段类型为string

问题描述

需要将ods库中所有表的bigint和boolean类型修改成string类型
700多个表 ,根本不可能手动一个一个去修改
所以写了一个脚本

问题解决

#! /bin/bash
task=$1
cat $task | while read table
do
    # 获取当前表的字段名称和字段类型
    hive -e"
    use ods;
    desc ${table};
    ">${task}_temp.txt
    # 遍历temp.txt 如果是bigint 或者是boolean就修改类型为string
    cat ${task}_temp.txt | while read line
    do
        # 取出字段类型和字段名称
        column=$(echo $line | awk '{print $1}')
        c_type=$(echo $line | awk '{print $2}')

        # 判断字段类型并修改
        if [[ ${c_type} == 'bigint' || ${c_type} == 'boolean' ]];then
            hive -e"
                use ods;
                alter table ${table} change column ${column} ${column} string;
            "
        fi
    done
    echo ${table}完成
done

如果表特别多,比如我这里700多个,可以首先将文件按照行分割成多个小文件,然后同时执行

#分割文件
split -l 100 文件名 分割后的文件前缀
#例如
split -l 100 table.txt table
# 结果
tableaa tableab tableac tablead tableae tableaf tableag tableah

写一个启动脚本,这里手法有点垃圾,主要文件少,文件多的话可以写一个循环,我直接就yy,pppppppp…了

#! /bin/bash
nohup sh ch_hive_columns_type_plus.sh ./task/tableaa &
nohup sh ch_hive_columns_type_plus.sh ./task/tableab &
nohup sh ch_hive_columns_type_plus.sh ./task/tableac &
nohup sh ch_hive_columns_type_plus.sh ./task/tablead &
nohup sh ch_hive_columns_type_plus.sh ./task/tableae &
nohup sh ch_hive_columns_type_plus.sh ./task/tableaf &
nohup sh ch_hive_columns_type_plus.sh ./task/tableag &
nohup sh ch_hive_columns_type_plus.sh ./task/tableah &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您可以使用 Apache Hive 的 INSERT INTO 语句来实现抽取 shtd_store 库中 CUSTOMER 的全量数据到 ods 库中的 customer 中,同时添加静态分区。示例代码如下: ``` INSERT INTO TABLE ods.customer PARTITION (partition_date='yyyyMMdd') SELECT * FROM shtd_store.CUSTOMER ORDER BY column1, column2, ...; ``` 其中,`partition_date` 是分区字段的名称,`'yyyyMMdd'` 是分区的值,请根据实际需求替换为实际的分区字段值。在 SELECT 子句中,您可以使用 `ORDER BY` 子句对 CUSTOMER 中的字段进行排序,保证导入到 ods.customer 中的数据按照指定顺序排列。 请注意,在插入数据之前,您需要先确保 ods 库中的 customer 存在,且分区字段类型和名称与代码中的定义一致。 ### 回答2: 要抽取shtd_store库中CUSTOMER的全量数据进入Hive的ods库中customer,并按照要求进行字段排序和添加静态分区,分区字段类型String,值为某日期(分区字段格式为yyyyMMdd)。 首先,需要创建一个名为customer的,在ods库下,并指定静态分区字段类型。静态分区字段类型String,可以使用以下代码创建该: ``` CREATE TABLE ods.customer ( -- 添加字段字段类型与shtd_store库中CUSTOMER字段类型保持一致 ) PARTITIONED BY (partition_date string); ``` 接下来,可以使用INSERT...SELECT语句来抽取shtd_store库中CUSTOMER的全量数据,并将其插入到ods库的customer中。为了实现字段排序,可以在SELECT语句中按照排序要求对字段进行排序。 假设某日期为20211001,可以使用以下代码完成数据抽取和插入操作: ``` INSERT OVERWRITE TABLE ods.customer PARTITION (partition_date='20211001') SELECT -- 按照字段排序要求选择字段,并保持字段顺序与CREATE TABLE中的字段顺序一致 FROM shtd_store.CUSTOMER; ``` 以上代码将shtd_store库中CUSTOMER的全量数据抽取并插入到ods库的customer中,同时添加了静态分区,分区字段为partition_date,类型String,并设置为20211001。 需要注意的是,根据实际情况修改上述代码中的名、字段名、日期值等部分,确保代码的准确性和适应性。 ### 回答3: 要抽取shtd_store库中CUSTOMER的全量数据进入Hive的ods库中customer,首先我们需要创建ods库中的customer,并指定字段的排序和类型保持不变。同时,我们还需要为目标添加静态分区,分区字段类型String,值为某个特定日期(分区字段的格式为yyyyMMdd)。 首先,我们可以使用Hive命令或者HiveQL来完成这个任务。以下是示例代码: 1. 创建ods库中的customer: ```sql CREATE TABLE ods.customer ( id INT, name STRING, age INT, address STRING ) PARTITIONED BY (date STRING) CLUSTERED BY (id) SORTED BY (id) INTO 2 BUCKETS; ``` 在创建时,我们通过PARTITIONED BY指定了date字段为分区字段类型String。 2. 抽取shtd_store库中CUSTOMER的全量数据并插入ods.customer: ```sql INSERT OVERWRITE TABLE ods.customer PARTITION(date='20221231') SELECT id, name, age, address FROM shtd_store.CUSTOMER; ``` 以上代码中,我们使用INSERT OVERWRITE TABLE语句将shtd_store库中CUSTOMER的数据插入到ods.customer中,并指定了date字段的分区值为某个日期(例如20221231)。 注意:实际使用时,需要根据数据库和的实际情况进行修改。 以上就是按照要求抽取shtd_store库中CUSTOMER的全量数据进入Hive的ods库中customer的步骤。通过指定字段排序、类型保持不变,并添加静态分区,我们可以有效地将数据从源抽取到目标中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antgeek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值