一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java API如何實現向Hive批量導入數據

Java API如何實現向Hive批量導入數據

2021-10-19 10:35盛裝吾步 Java教程

這篇文章主要介紹了Java API如何實現向Hive批量導入數據的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java API實現向Hive批量導入數據

Java程序中產生的數據,如果導入oracle或者mysql庫,可以通過jdbc連接insert批量操作完成,但是當前版本的hive并不支持批量insert操作,因為需要先將結果數據寫入hdfs文件,然后插入Hive表中。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.enn.idcard;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
 * <p>Description: </p>
 * @author kangkaia
 * @date 2017年12月26日 下午1:42:24
 */
public class HiveJdbc {
    public static void main(String[] args) throws IOException {
        List<List> argList = new ArrayList<List>();
        List<String> arg = new ArrayList<String>();
        arg.add("12345");
        arg.add("m");
        argList.add(arg);
        arg = new ArrayList<String>();
        arg.add("54321");
        arg.add("f");
        argList.add(arg);
//      System.out.println(argList.toString());
        String dst = "/test/kk.txt";
        createFile(dst,argList);
        loadData2Hive(dst);
    }
 
    /**
     * 將數據插入hdfs中,用于load到hive表中,默認分隔符是"\001"
     * @param dst
     * @param contents
     * @throws IOException
     */
    public static void createFile(String dst , List<List> argList) throws IOException{
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        Path dstPath = new Path(dst); //目標路徑
        //打開一個輸出流
        FSDataOutputStream outputStream = fs.create(dstPath);
        StringBuffer sb = new StringBuffer();
        for(List<String> arg:argList){
            for(String value:arg){
                sb.append(value).append("\001");
            }
            sb.deleteCharAt(sb.length() - 4);//去掉最后一個分隔符
            sb.append("\n");
        }
        sb.deleteCharAt(sb.length() - 2);//去掉最后一個換行符
        byte[] contents =  sb.toString().getBytes();
        outputStream.write(contents);
        outputStream.close();
        fs.close();
        System.out.println("文件創建成功!");       
    }
    /**
     * 將HDFS文件load到hive表中
     * @param dst
     */
    public static void loadData2Hive(String dst) {
        String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver";
        String CONNECTION_URL = "jdbc:hive2://server-13:10000/default;auth=noSasl";
        String username = "admin";
        String password = "admin";
        Connection con = null;
        
        try {
            Class.forName(JDBC_DRIVER);
            con = (Connection) DriverManager.getConnection(CONNECTION_URL,username,password);
            Statement stmt = con.createStatement();        
            String sql = " load data inpath '"+dst+"' into table population.population_information ";
            
            stmt.execute(sql);
            System.out.println("loadData到Hive表成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            // 關閉rs、ps和con
            if(con != null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }   
}

注意:

本例使用mvn搭建,conf配置文件放在src/main/resources目錄下。

Hive提供的默認文件存儲格式有textfile、sequencefile、rcfile等。用戶也可以通過實現接口來自定義輸入輸的文件格式。

在實際應用中,textfile由于無壓縮,磁盤及解析的開銷都很大,一般很少使用。Sequencefile以鍵值對的形式存儲的二進制的格式,其支持針對記錄級別和塊級別的壓縮。rcfile是一種行列結合的存儲方式(text file和sequencefile都是行表[row table]),其保證同一條記錄在同一個hdfs塊中,塊以列式存儲。一般而言,對于OLTP而言,行表優勢大于列表,對于OLAP而言,列表的優勢大于行表,特別容易想到當做聚合操作時,列表的復雜度將會比行表小的多,雖然單獨rcfile的列運算不一定總是存在的,但是rcfile的高壓縮率確實減少文件大小,因此實際應用中,rcfile總是成為不二的選擇,達觀數據平臺在選擇文件存儲格式時也大量選擇了rcfile方案。

通過hdfs導入hive的表默認是textfile格式的,因此可以改變存儲格式,具體方法是先創建sequencefile、rcfile等格式的空表,然后重新插入數據即可。

?
1
2
3
insert overwrite table seqfile_table select * from textfile_table;
……
insert overwrite table rcfile_table select * from textfile_table;

java 批量插入hive中轉在HDFS

稍微修改了下,這文章是通過將數據存盤后,加載到HIVE.

模擬數據放到HDFS然后加載到HIVE,請大家記得添加HIVE JDBC依賴否則會報錯。

加載前的數據表最好用外部表,否則會drop表的時候元數據會一起刪除!

?
1
2
3
4
5
<dependency>
 <groupId>org.apache.hive</groupId>
 <artifactId>hive-jdbc</artifactId>
 <version>1.1.0</version>
</dependency>

代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class Demo {
        public static void main(String[] args) throws Exception {
            List<List> argList = new ArrayList<List>();
            List<String> arg = new ArrayList<String>();
            arg.add("12345");
            arg.add("m");
            argList.add(arg);
            arg = new ArrayList<String>();
            arg.add("54321");
            arg.add("f");
            argList.add(arg);
//          System.out.println(argList.toString());
            String dst = "/test/kk.txt";
            createFile(dst,argList);
//          loadData2Hive(dst);
        }
        /**
         * 將數據插入hdfs中,用于load到hive表中,默認分隔符是"|"
         * @param dst
         * @param contents
         * @throws IOException
         * @throws Exception
         * @throws InterruptedException
         */
        public static void createFile(String dst , List<List> argList) throws IOException, InterruptedException, Exception{
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(new URI("hdfs://hadoop:9000"),conf,"root");
            Path dstPath = new Path(dst); //目標路徑
            //打開一個輸出流
            FSDataOutputStream outputStream = fs.create(dstPath);
            StringBuffer sb = new StringBuffer();
            for(List<String> arg:argList){
                for(String value:arg){
                    sb.append(value).append("|");
                }
                sb.deleteCharAt(sb.length() - 1);//去掉最后一個分隔符
                sb.append("\n");
            }
            byte[] contents =  sb.toString().getBytes();
            outputStream.write(contents);
            outputStream.flush();;
            outputStream.close();
            fs.close();
            System.out.println("文件創建成功!");
            
        }
        /**
         * 將HDFS文件load到hive表中
         * @param dst
         */
        public static void loadData2Hive(String dst) {
            String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver";
            String CONNECTION_URL = "jdbc:hive2://hadoop:10000/default";
            String username = "root";
            String password = "root";
            Connection con = null;
            
            try {
                Class.forName(JDBC_DRIVER);
                con = (Connection) DriverManager.getConnection(CONNECTION_URL,username,password);
                Statement stmt = con.createStatement();
                
                String sql = " load data inpath '"+dst+"' into table test ";//test 為插入的表
                
                stmt.execute(sql);
                System.out.println("loadData到Hive表成功!");
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }finally {
                // 關閉rs、ps和con
                if(con != null){
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
    }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/kangkangwanwan/article/details/78915134

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 国产精品不卡 | 精品视频一区二区观看 | 女同志freelesvoices | 亚洲男人天堂2023 | 歪歪漫画a漫入口 | 日本中文字幕一区二区有码在线 | 和老外3p爽粗大免费视频 | 国产良心大作白丝精厕 | 亚洲乱码一二三四五六区 | 亚洲欧美优优色在线影院 | 91精品91久久久久久 | 日本加勒比无码av | 日韩欧美高清一区 | 四虎在线最新永久免费 | 2022国产麻豆剧传媒古装 | 91桃花视频 | 国产欧美日韩不卡一区二区三区 | 国产卡一卡二卡3卡乱码免费 | 福利视频一区二区牛牛 | 国内精品 大秀视频 日韩精品 | 99re8在线精品视频免费播放 | 国产精品一久久香蕉产线看 | 四虎影视免费 | 成人国产精品视频 | 99精品视频免费 | 青青草成人在线观看 | 国产成人夜色91 | 国产一级一级一级成人毛片 | 国产成人啪精品视频站午夜 | 手机看片国产免费久久网 | 二次元美女互摸隐私互扒 | 精品一区heyzo在线播放 | 亚洲精品在线网址 | 特级毛片全部免费播放器 | 91sao在线看片水片 | 天天综合色天天综合 | 国产乱子伦一区二区三区 | 大学生宿舍飞机china free | 114级毛片免费观看 1024亚洲天堂 | 国产91一区二区在线播放不卡 | 久久久久久久久人体 |