繁体   English   中英

如何将数据插入Hive中的Parquet表

[英]How to insert data into Parquet table in Hive

我有简单的文本表(用“,”分隔),格式如下:

orderID INT, CustID INT, OrderTotal FLOAT, OrderNumItems INT, OrderDesc STRING

我想将这些数据插入到Parquet表中:我使用以下方法创建了表:

CREATE TABLE parquet_test (orderID INT, CustID INT, OrderTotal FLOAT, 
OrderNumItems INT, OrderDesc STRING) 
ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' stored as 
INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat' 
OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';

但是当我试图使用时插入数据

insert overwrite table parquet_small_orders select * from small_orders;

它失败。 有什么想法吗?

我将分享我刚刚测试的内容并且它工作得非常好。 我知道这可能是Hive目前可以解决的与版本相关的问题。 无论如何我会解释我刚做的事情,

1.检查原始数据

$ cat myFile.txt

orderID INT, CustID INT, OrderTotal FLOAT, OrderNumItems INT, OrderDesc STRING
100,1000,100000,5,"aa"
200,2000,200000,6,"bb"
300,3000,300000,7,"cc"
400,4000,400000,8,"dd"
500,5000,500000,9,"ee"

2.安装指向文件的Hive表

Create external table myDB.orders(orderID INT, CustID INT, OrderTotal FLOAT, OrderNumItems INT, OrderDesc STRING)
row format 
delimited FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE 
LOCATION '/my/path/to/csv'
tblproperties ("skip.header.line.count"="1");

4.检查Hive表是否正常工作。 请注意,我添加了一个句子来忽略第一行,它通常是csv文件的标题。

从myDB.orders中选择*;

100,1000,100000.0,5,"aa" 
200,2000,200000.0,6,"bb" 
300,3000,300000.0,7,"cc" 
400,4000,400000.0,8,"dd" 
500,5000,500000.0,9,"ee"

5.安装镶木地板桌:

CREATE TABLE myDB.parquet_test (orderID INT, CustID INT, OrderTotal FLOAT,
OrderNumItems INT, OrderDesc STRING)
ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' stored as
INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat'
location '/my/path/to/parquet';

6.将CSV Hive表中的数据插入Hive Parquet表(在此过程中转换为镶木地板)

insert overwrite table myDB.parquet_test select * from myDB.orders;

最后,我仔细检查了数据转换是否正确,对myDB.parquet_test进行了简单的查询。 为了100%确定数据在Parquet中,我去了/my/path/to/parquet ,我仔细检查了那些文件实际上是在Parquet中。 不确定你的问题是因为你没有跳过文件的标题或者你正在使用的版本,但是我再说一遍,这些步骤效果很好。

您在蜂巢服务器端获得的错误消息是什么?

我遇到了类似的问题。 在hive服务器日志中,我看到了一些堆内存问题。

我可以在mapred-site.xml中使用更高的值解决我的hadoop安装问题

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1536</value> 
</property>

<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1024M</value> 
</property>

<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>3072</value> 
</property>

<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx2560M</value> 
</property>

你有没有遵循这些步骤?

  1. 下载parquet-hive-bundle-1.5.0.jar
  2. 修改hive-site.xml以包含以下内容:

     <property> <name>hive.jar.directory</name> <value>/home/hduser/hive/lib/parquet-hive-bundle-1.5.0.jar</value> <description> This is the location hive in tez mode will look for to find a site wide installed hive instance. If not set, the directory under hive.user.install.directory corresponding to current user name will be used. </description> </property> 

适合我; 见下文。 我们看不到你的csv表定义,但我相信你可能需要给它分隔符? 无论如何,我的代码应该有所帮助。

马特

hive> create table te3 (x int, y int)                                        
    > row format delimited                                                   
    > FIELDS TERMINATED BY ','       
    > STORED AS TEXTFILE;
hive> LOAD DATA LOCAL INPATH '/home/cloudera/test/' OVERWRITE INTO TABLE te3;
Copying data from file:/home/cloudera/test
Copying file: file:/home/cloudera/test/testfile.csv
Loading data to table default.te3
Table default.te3 stats: [numFiles=1, numRows=0, totalSize=12, rawDataSize=0]
OK
Time taken: 1.377 seconds
hive> select * from te3;                                                     
OK
1   2
3   4
5   6
Time taken: 0.566 seconds, Fetched: 3 row(s)
hive> create table ptest (a INT, b INT)
    > ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe' stored as 
    > INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat' 
    > OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';
OK
Time taken: 0.413 seconds
hive> insert overwrite table ptest select * from te3;
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1423179894648_0001, Tracking URL = http://quickstart.cloudera:8088/proxy/application_1423179894648_0001/
Kill Command = /usr/lib/hadoop/bin/hadoop job  -kill job_1423179894648_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2015-02-09 14:08:16,308 Stage-1 map = 0%,  reduce = 0%
2015-02-09 14:08:45,342 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.55 sec
MapReduce Total cumulative CPU time: 1 seconds 550 msec
Ended Job = job_1423179894648_0001
Stage-Stage-1: Map: 1   Cumulative CPU: 1.99 sec   HDFS Read: 234 HDFS Write: 377 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 990 msec
OK
Time taken: 68.96 seconds
hive> select * from ptest;
OK
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
1   2
3   4
5   6
Time taken: 0.06 seconds, Fetched: 3 row(s)
hive> 

Matthieu Lieber的答案描述了如何将数据加载到镶木桌子上。

在您发布下一个问题之前的几件事情。

  1. 请提及您正在使用的版本。 在0.13之前的Hive版本中,Parquet不是本机支持的,你需要添加一些显式的jar来获得功能。

  2. 请添加日志/错误消息。 “失败”是对错误的模糊描述,它使调试变得困难。 您正在进行数据加载的方式似乎没问题,它应该可以正常工作。 但是,日志可以清楚地说明问题所在。

如果这仍然是一个悬而未决的问题,您可以参考Cloudera的文档 ,了解如何使用Parquet with Hive的一些基础知识。

谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM