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

时间:2014-04-18 08:24:24

标签: hadoop hive parquet

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

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;

失败了。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

我将分享我刚刚测试过的内容,它的工作非常好。我知道这可能是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中。 不确定你的问题是因为你没有跳过文件的标题或者你正在使用的版本,但是我再说一遍,这些步骤效果很好。

答案 1 :(得分:0)

您在配置单元服务器端获得了哪些错误消息?

我有类似的问题。在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>

答案 2 :(得分:0)

您是否按照这些步骤进行操作?

  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>
    

答案 3 :(得分:0)

适合我;见下文。 我们看不到你的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> 

答案 4 :(得分:0)

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

在你发布下一个问题之前要做一些事情。

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

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

  3. 如果这仍然是一个悬而未决的问题,您可以参考Cloudera's documentation查看有关如何将Parquet与Hive一起使用的一些基础知识。

    谢谢!