从Hive表中导出数据到文件

本文介绍四种从Hive导出查询结果的方法:通过重定向将结果保存到本地文件;使用INSERT OVERWRITE LOCAL DIRECTORY命令;利用Hadoop命令保存到本地;及使用Sqoop导出Hive表。

在这里插入图片描述

  1. 保存结果到本地

    方法一:通过重定向方式,将查询结果写到指定的文件中

    hive -e "SELECT id,concat_ws(',',collect_set(concat(k1,'-',k2,'-',k3))) from test.users GROUP BY id;" > users.data
    

    查看

    [root@node00 ~]# cat users.data 
    1	a1-a2-a3,a11-a22-a33,a111-a222-a333
    2	b1-b2-b3,b11-b22-b33
    

    方法二:使用INSERT OVERWRITE LOCAL DIRECTORY保存结果到本地

    hive -e "
    INSERT OVERWRITE LOCAL DIRECTORY '/home/charles/users.data' 
    ROW format delimited fields terminated BY '\t' 
    SELECT id,concat_ws(',',collect_set(concat(k1,'-',k2,'-',k3))) from test.users GROUP BY id;
    "
    

    查看

    [root@node00 charles]# ll -a users.data
    total 16
    -rw-r--r-- 1 root root   61 May  9 17:24 000000_0
    -rw-r--r-- 1 root root   12 May  9 17:24 .000000_0.crc
    [root@node00 charles]# cat users.data/000000_0 
    1	a1-a2-a3,a11-a22-a33,a111-a222-a333
    2	b1-b2-b3,b11-b22-b33
    

    方法三:使用Hadoop命令保存结果到本地

    [root@cdh01 ~]# hdfs dfs -get /user/hive/warehouse/test /root/test;
    

    查看

    [root@cdh01 ~]# cat /root/test/data.txt
    {"one":true,"three":["red","yellow","orange"],"two":19.5,"four":"poop"}
    {"one":false,"three":["red","yellow","black"],"two":129.5,"four":"stars"}
    {"one":false,"three":["pink","gold"],"two":222.56,"four":"fiat"}
    

    方法四:利用 Sqoop 导出 Hive 表

  2. 保存结果到HDFS中

    方法一:使用INSERT OVERWRITE DIRECTORY命令保存结果到HDFS

    hive -e "
    INSERT OVERWRITE DIRECTORY '/users.data' 
    ROW format delimited fields terminated BY '\t' 
    SELECT id,concat_ws(',',collect_set(concat(k1,'-',k2,'-',k3))) from test.users GROUP BY id;
    "
    

    查看

    [root@node00 ~]# hdfs dfs -ls /users.data
    Found 1 items
    -rwxrwxrwx   3 root supergroup         61 2019-05-09 17:28 /users.data/000000_0
    [root@node00 ~]# hdfs dfs -cat /users.data/000000_0
    1	a1-a2-a3,a11-a22-a33,a111-a222-a333
    2	b1-b2-b3,b11-b22-b33
    

    方法二:使用export命令保存结果到HDFS

    hive> export table default.test to '/root/test/';
    Copying data from file:/tmp/hdfs/849dfd20-a5df-4994-a5fa-2aa44c28f5dc/hive_2019-07-19_23-13-00_527_6322373220241253473-1/-local-10000/_metadata
    Copying file: file:/tmp/hdfs/849dfd20-a5df-4994-a5fa-2aa44c28f5dc/hive_2019-07-19_23-13-00_527_6322373220241253473-1/-local-10000/_metadata
    Copying data from hdfs://cdh01.cnyimi.cn:8020/user/hive/warehouse/test
    Copying file: hdfs://cdh01.cnyimi.cn:8020/user/hive/warehouse/test/data.txt
    OK
    

    查看

    [root@cdh01 ~]# hdfs dfs -cat /root/test/_metadata
    {"version":"0.1","table":"{\"1\":{\"str\":\"test\"},\"2\":{\"str\":\"default\"},\"3\":{\"str\":\"root\"},\"4\":{\"i32\":1561560428},\"5\":{\"i32\":0},\"6\":{\"i32\":0},\"7\":{\"rec\":{\"1\":{\"lst\":[\"rec\",4,{\"1\":{\"str\":\"one\"},\"2\":{\"str\":\"boolean\"}},{\"1\":{\"str\":\"three\"},\"2\":{\"str\":\"array<string>\"}},{\"1\":{\"str\":\"two\"},\"2\":{\"str\":\"double\"}},{\"1\":{\"str\":\"four\"},\"2\":{\"str\":\"string\"}}]},\"2\":{\"str\":\"hdfs://cdh01.cnyimi.cn:8020/user/hive/warehouse/test\"},\"3\":{\"str\":\"org.apache.hadoop.mapred.TextInputFormat\"},\"4\":{\"str\":\"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\"},\"5\":{\"tf\":0},\"6\":{\"i32\":-1},\"7\":{\"rec\":{\"2\":{\"str\":\"org.openx.data.jsonserde.JsonSerDe\"},\"3\":{\"map\":[\"str\",\"str\",1,{\"serialization.format\":\"1\"}]}}},\"8\":{\"lst\":[\"str\",0]},\"9\":{\"lst\":[\"rec\",0]},\"10\":{\"map\":[\"str\",\"str\",0,{}]},\"11\":{\"rec\":{\"1\":{\"lst\":[\"str\",0]},\"2\":{\"lst\":[\"lst\",0]},\"3\":{\"map\":[\"lst\",\"str\",0,{}]}}},\"12\":{\"tf\":0}}},\"8\":{\"lst\":[\"rec\",0]},\"9\":{\"map\":[\"str\",\"str\",6,{\"totalSize\":\"211\",\"numRows\":\"0\",\"rawDataSize\":\"0\",\"numFiles\":\"1\",\"transient_lastDdlTime\":\"1561560623\",\"numFilesErasureCoded\":\"0\"}]},\"12\":{\"str\":\"MANAGED_TABLE\"},\"15\":{\"i32\":1}}","partitions":[]}
    [root@cdh01 ~]# hdfs dfs -cat /root/test/data/data.txt
    {"one":true,"three":["red","yellow","orange"],"two":19.5,"four":"poop"}
    {"one":false,"three":["red","yellow","black"],"two":129.5,"four":"stars"}
    {"one":false,"three":["pink","gold"],"two":222.56,"four":"fiat"}
    
<think>我们需要使用Java连接Hive,并将数据导出为CSV文件。 步骤: 1. 引入必要的依赖(如Hive JDBC驱动) 2. 建立与Hive的连接 3. 执行查询,获取结果集 4. 将结果集写入CSV文件 注意:Hive的JDBC驱动类名为`org.apache.hive.jdbc.HiveDriver`,连接URL通常为`jdbc:hive2://<host>:<port>/<database>`。 假设我们有一个`my_table`,我们要将其所有数据导出到`output.csv`。 由于Hive可能数据量很大,我们需要注意内存,使用ResultSet逐行读取并写入文件,而不是一次性加载到内存。 另外,需要处理CSV格式中的特殊字符(如逗号、换行、引号),通常用双引号将字段括起来,并转义字段内的双引号。 但是,Hive本身可能包含复杂数据类型,这里我们假设导出的都是基本类型,且我们按照字符串处理。 以下是一个示例代码:</think>### Java 连接 Hive 导出 CSV 文件方法 以下是使用 Java 通过 JDBC 连接 Hive 并将数据导出为 CSV 文件的完整代码示例: ```java import java.io.FileWriter; import java.sql.*; public class HiveToCsvExporter { public static void main(String[] args) { // JDBC 连接参数 String driver = "org.apache.hive.jdbc.HiveDriver"; String url = "jdbc:hive2://your-hive-server:10000/default"; String user = "your-username"; String password = "your-password"; String tableName = "your_table_name"; String outputFile = "/path/to/output.csv"; try (Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); FileWriter writer = new FileWriter(outputFile)) { // 加载 Hive JDBC 驱动 Class.forName(driver); // 获取元数据并写入列头 ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { writer.append(metaData.getColumnName(i)); if (i < columnCount) writer.append(","); } writer.append("\n"); // 写入数据行 while (rs.next()) { for (int i = 1; i <= columnCount; i++) { String value = rs.getString(i); // 处理 CSV 特殊字符 if (value != null) { if (value.contains(",") || value.contains("\"") || value.contains("\n")) { value = "\"" + value.replace("\"", "\"\"") + "\""; } } else { value = ""; } writer.append(value); if (i < columnCount) writer.append(","); } writer.append("\n"); } System.out.println("数据导出成功至: " + outputFile); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 关键步骤说明: 1. **依赖配置**:需添加 Hive JDBC 驱动(如 `hive-jdbc-*.jar`) 2. **连接参数**: - `url`:HiveServer2 地址(默认端口 10000) - 认证:根据集群配置选择 Kerberos/SASL 或用户名密码 3. **CSV 格式化**: - 自动添加列头 - 处理字段中的逗号、引号和换行符 - 空值转为空字符串 4. **执行流程**: - 建立连接 → 执行查询 → 流式处理结果集 → 写入文件 ### 注意事项: 1. 大数据量时建议添加分页查询(使用 `LIMIT` 和 `OFFSET`) 2. 复杂数据类型(如 ARRAY/MAP)需特殊处理 3. 需确保 HiveServer2 服务已启用且网络可达 4. 导出前确认用户有查询权限
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值