动态加载不同的XML文件到Hive表

时间:2015-04-13 05:12:11

标签: java xml hive

我有一个不同复杂XML文件的文件夹/流(每个文件大小约为1GB)。我知道如何将XML文件数据加载到Hive表(或任何Hadoop数据库) 但我想知道两件事:

  1. 我可以将每个xml文件数据加载到hive 动态,即无需显式编写 create table 命令(因为我将不同的XML文件作为流),是否存在任何自动完成此任务的方式。
  2. “不同复杂xml文件的流 - >加载到Hive表(无需手动编写创建表命令) - >使用加载到Hive表中的数据”

    1. 如何编写命令行脚本来创建配置单元表,如何编写Java代码以将xml数据加载到Hive表。

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,AFAIK,这是不可能的。 Hive旨在管理 Hive表中存储的数据(它不总是存储在表中,但是元数据被添加到表中,指向到真实数据,这是Hive外部表格的情况。)

我认为你唯一可以尝试的是为XML文件中的所有数据创建一个大表,已存储的数据和未来的数据;诀窍是将所有XML文件放在一个公共HDFS文件夹下,该文件夹用作create table命令的位置。

关于第二个问题,请参阅以下代码:

public final class HiveBasicClient {

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

    private static Connection getConnection(String hiveServer, String hivePort, String hadoopUser, String hadoopPassword) {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            return null;
        }

        try {
            return DriverManager.getConnection("jdbc:hive://" + hiveServer + ":" + hivePort + "/default?user=" + hadoopUser + "&password=" + hadoopPassword);
        } catch (SQLException e) {
            return null;
        } 
    }

    private static res doQuery(String query) {
        try {
            Statement stmt = con.createStatement();
            ResultSet res = stmt.executeQuery(query);
            res.close();
            stmt.close();
            return res;
        } catch (SQLException ex) {
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        String hiveServer = args[0];
        String hivePort = args[1];
        String hadoopUser = args[2];
        String hadoopPassword = args[3];

        con = getConnection(hiveServer, hivePort, hadoopUser, hadoopPassword);
        doQuery("create external table <table_name> (<list_of_columns>) row format serde '<your_xml_serde>' location `<your_xml_files_location>');
    }

}

希望它有所帮助。