牛骨文教育服务平台(让学习变的简单)
博文笔记

如何生成hive的建表语句(批量)

创建时间:2016-06-06 投稿人: 浏览次数:7672

问题场景

在一个hadoop 1的hive系统中,有很多表只有表结构没有数据,现在需要把这些表迁移到hadoop 2的hive上。

那么需要这些表的建表语句。

show create table tb_name可以解决一个表的建表脚本,那么如何获得多个表的建表脚本?

前提是表非常多。。

Java连接Hive

利用jdbc连接到hive,使用java程序写一个循环。

先获取全部表,然后show create table每个表。

没能尝试成功,一直连接不上:

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveTestCase {

    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    public static void main(String[] args)
            throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }

        Connection con = DriverManager.getConnection("jdbc:hive2://10.1.69.170:10002/hn_dw", "hadoop", "1qaz@WSX");
        Statement stmt = con.createStatement();
        String tableName = "wyphao";
        stmt.execute("drop table if exists " + tableName);
        stmt.execute("create table " + tableName + " (key int, value string)");
        System.out.println("Create table success!");
        // show tables
        String sql = "show tables "" + tableName + """;
        System.out.println("Running: " + sql);
        ResultSet res = stmt.executeQuery(sql);
        if (res.next()) {
            System.out.println(res.getString(1));
        }

        // describe table
        sql = "describe " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1) + "	" + res.getString(2));
        }


        sql = "select * from " + tableName;
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(String.valueOf(res.getInt(1)) + "	" + res.getString(2));
        }

        sql = "select count(1) from " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }
    }
}

网上的资料

Hive的JDBC接口实现(Eclipse环境配置)
java 通过jdbc驱动连接hive操作实例
HIve的JavaAPI操作
配置HiveServer2的安全策略之自定义用户名密码验证
Hive:用Java代码通过JDBC连接Hiveserver介绍
HIVE JDBC连接详解

使用Hive执行hive命令输出到本地文件

hive -S -e "select package_name,count(1) from app_list group by package_name;"> grp_app_id.dat

这样就能使用生成的脚本了:(这里用到文本编辑器Sublime Text)

这里写图片描述

改造成shell脚本,头上加入#!/bin/bash

然后执行脚本:
这里写图片描述
导出完成。

然后再合并文件:

cat *.sql > create.sql

网上的参考链接

Hive中的三种不同的数据导出方式介绍
HIVE部署安装(笔记)
hive导出查询文件到本地文件的2种办法

遗留的问题

Java连接hive,还是不行,我觉得是卡在用户名密码不对。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。