我有一个不同复杂XML文件的文件夹/流(每个文件大小约为1GB)。我知道如何将XML文件数据加载到Hive表(或任何Hadoop数据库) 但我想知道两件事:
“不同复杂xml文件的流 - >加载到Hive表(无需手动编写创建表命令) - >使用加载到Hive表中的数据”
答案 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>');
}
}
希望它有所帮助。