我是靠谱客的博主 健康羊,最近开发中收集的这篇文章主要介绍windows数据导入到hive表,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

需求说明:

  • 将windows系统下数据存入hive表中
  • windows下数据源是压缩格式,即.zip
  • 本文中本地环境是指linux环境

实例:

  1. 逻辑:
    • 建表(根据数据源或需求建普通表或分区表)—>加载数据—>将windows中.zip数据复制到本地—>本地解压zip数据—>执行hive命令
  2. 建数据库。 hive创建数据库testdb

    CREATE DATABASE IF NOT EXISTS testdb;
    
  3. 建表。hive创建外部表test

    CREATE EXTERNAL TABLE IF NOT EXISTS test
    (
    id STRING,tit STRING,ts  STRING,url STRING
    )
    PARTITIONED BY (datelabel STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY 't'
    stored as textfile
    location '/test/data';
    
  4. 复制数据源到本地。将windows数据移动到本地文件夹下(linux环境下)

    • 将windows下data.zip复制到linux下。由于安装winscp软件,直接在winscp软件中拖拽即可实现复制,也可使用命令行。
    • 移动到本地/home/myhadoop/下,先解压data.zip到/home/myhadoop/data/testdata目录下。

      • 解压命令:

        unzip /home/myhadoop/data.zip //解压zip到当前目录
        unzip /home/myhadoop/data.zip -d /home/myhadoop/data/testdata  //解压到/home/myhadoop/data/testdata目录
        
      • Linux下data目录结构:

        /home/myhadoop/data/testdata
            -datelabel=201701
                -part-00000
                -part-00001
                -part-00000
            -datelabel=201702
                ...
            -datelabel=201703
                ...
        
      • 数据内容格式:

        1   a   148 http://www.baidu.com.html
        2   b   148 http://www.baidu.com.html
        3   c   148 http://www.baidu.com.html
        
    • 执行load命令
      a. 数据在hafs中,使用命令LOAD DATA INPATH …
      b. 数据在本地(linux)中,使用命令LOAD DATA LOCAL INPATH …

      • 使用Hivesql多次加载。

        • 在hive环境下执行;
        • 共有三个datelabel=2017XX文件夹,就要执行三次load data命令;

          hive>LOAD DATA LOCAL INPATH '/home/myhadoop/data/testdata/201611/datelabel=20161102' OVERWRITE INTO TABLE e_zhizi.bitauto1 PARTITION (datelabel='20161102');
          
      • 使用hive -f load.sql命令,一次加载。

        • 在Hadoop环境下执行hive -f load.sql命令,如果在hive环境下会报NoViableAltException异常

          NoViableAltException(26@[])
          at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1071)
          at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:202)
          at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)
          at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:396)
          at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:308)
          at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1122)
          at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1170)
          at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1059)
          at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1049)
          at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:213)
          at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:165)
          at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376)
          at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:736)
          at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681)
          at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.lang.reflect.Method.invoke(Method.java:606)
          at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
          at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
          FAILED: ParseException line 1:0 cannot recognize input near 'hive' '-' 'f'
          
        • load.sql文件:

          LOAD DATA LOCAL INPATH '/home/myhadoop/data/testdata/datelabel=201701' OVERWRITE INTO TABLE testdb.test PARTITION (datelabel='201701');
          LOAD DATA LOCAL INPATH '/home/myhadoop/data/testdata/datelabel=201702' OVERWRITE INTO TABLE testdb.test PARTITION (datelabel='201702');
          LOAD DATA LOCAL INPATH '/home/myhadoop/data/testdata/datelabel=201703' OVERWRITE INTO TABLE testdb.test PARTITION (datelabel='201703');
          
  5. 检验是否成功加载数据。使用select 等命令显示数据,例:

    select * from test where datelabel='201703' limit 10;
    

相关资料:

  1. hive文件存储格式
    • 参考链接http://www.cnblogs.com/zlslch/p/6103760.html
  2. hive数据的4种导入方式
    • 参考链接http://blog.csdn.net/lifuxiangcaohui/article/details/40588929
    • 从本地导入到hive表
    • 从hdfs导入到hive表
    • 从别的表中查询出的数据导入到hive表
    • 创建hive表时导入从别的表查询出的数据
  3. hive命令的3种调用方式

    • 在hive下直接执行HiveSQL语句:

      hive>select * from table_name;
      
    • 在hadoop环境下:

      hive -e 'select * from table_name'
      
    • 在hadoop环境下执行sql文件,多用于批量sql语句的情况

      hive -f XXX.sql
      
  4. hive常用操作:
    • http://blog.csdn.net/xiaoshunzi111/article/details/48727831
    • http://www.cnblogs.com/HondaHsu/p/4346354.html
  5. linux压缩、解压命令:
    • http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html

踩坑:

  1. 要求:windows上zip压缩数据—–>linux上解压后数据。
    • 移动到linux—>linux上解压(首选)
    • windows上解压—>移动到linux(不可行!1.速度慢2.费时3.丢数据)
  2. 执行hive -f/-e 等命令时不进入hive环境,直接在Hadoop环境下执行
  3. 分区数据和hive表创建语句必须是一致的。比如本文例子,数据源中有datelabel字段,那么创建hive表时需要设置分区字段。

最后

以上就是健康羊为你收集整理的windows数据导入到hive表的全部内容,希望文章能够帮你解决windows数据导入到hive表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部