将本地文件导入Hive


将本地文件导入Hive案例

如果嫌捣路径麻烦,可以配置Hive的环境变量:

[root@bigdata111 hive-1.2.1]# cd /etc/profile

#HIVE_HOME

export HIVE_HOME=/opt/module/hive-1.2.1/

export PATH=$PATH:$HIVE_HOME/bin

 使之生效:

[root@bigdata111 hive-1.2.1]# source /etc/profile

[root@bigdata111 hive-1.2.1]# hi

history         hive            hive-config.sh  hiveserver2

这样之后能给提示就成功配置环境变量了。

接下来将本地文件导入Hive

需求:将本地/opt/module/hiveTest/student.txt这个目录下的数据导入到hive的student(id int, name string)表中。

1.数据准备:

在/opt/module/hiveTest/这个目录下准备数据

(1)在/opt/module/目录下创建hiveTest

[root@bigdata111 module]# mkdir hiveTest/

(2)在/opt/module/hiveTest/目录下创建student.txt文件并添加数据

[root@bigdata111 module]# cd hiveTest/

[root@bigdata111 hiveTest]# vi student.txt

1001 zhangshan

1002 lishi

1003 zhaoliu

注意以tab键间隔。

2.Hive实际操作

(1)启动hive

[root@bigdata111 hiveTest]# hive

(2)显示数据库

hive (default)> show databases;

(3)显示default数据库中的表

hive (default)> show tables;

(4)删除已创建的student表

hive (default)> drop table student1;

(5)创建student表, 并声明文件分隔符’\t’

hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

hive (default)> create table student1 (id int,name string) row format delimited fields terminated by '\t';

可以进行查询:

 

(6)加载/opt/module/datas/student.txt 文件到student数据库表中。

hive (default)> load data local inpath '/opt/module/hiveTest/student.txt' into table student1;

(7)Hive查询结果

hive (default)> select * from student1;

OK

student1.id student1.name

1001 zhangsan

1002 lisi

1003 zhaoliu

Time taken: 0.435 seconds, Fetched: 3 row(s)

3.测试:

Hive加载数据时,如果加进来的数据与表定义的分隔符、类型不同,就会变成空值

除此之外,存到HDFS后文建会默认按照字典顺序排序(ASCII码从小到大),读取的时候也是按照这个顺序。

下面再向student1目录下加些分隔方式、类型不匹配的数据

1)分隔方式不匹配:

[root@bigdata111 hiveTest]# vi a

内容为:

1005 zhaoli(空格分隔的)

1006 qianqi

1007    sisi(tab键分隔的)

1008    hihi

加载:

hive (default)> load data local inpath '/opt/module/hiveTest/a' into table student1;

 

 

 

2)数据类型不匹配:

[root@bigdata111 hiveTest]# vi w

内容为:

kkk     soso(第一个数据类型不是规定的int,tab键分隔的)

1009    1212

加载:

hive (default)> load data local inpath '/opt/module/hiveTest/w' into table student1;

 

 

 

3)对于上面的Web页面可以发现文件顺序是按照字典顺序进行排序的。

从select语句的结果可以看出:从HDFS里读取数据也是按照这个文件先后顺序读的。

4.可能遇到的问题

再打开一个客户端窗口启动hive,会产生java.sql.SQLException异常。

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)

        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)

        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)

Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

        at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)

        at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)

        at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)

        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)

        ... 8 more

原因是,Metastore默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM