簡體   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