如何将数据插入到hive中的Parquet表中

cuxqih21  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(327)

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

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;

它失败了。有什么想法吗?

z9gpfhce

z9gpfhce1#

在配置单元服务器端收到的错误消息是什么?
我也有类似的问题。在配置单元服务器日志中,我看到一些堆内存问题。
我可以使用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>
au9on6nz

au9on6nz2#

为我工作;见下文。我们看不到您的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>
2o7dmzc5

2o7dmzc53#

你遵循这些步骤了吗?
下载 parquet-hive-bundle-1.5.0.jar 修订 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>
q43xntqr

q43xntqr4#

我将分享我刚刚测试的东西,它工作得非常好。我知道这可能是一个版本相关的问题,而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装载指向文件的配置单元表

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检查配置单元表是否正常工作。注意,我添加了一个忽略第一行的句子,这通常是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 parquet 安装台:

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配置单元表插入配置单元Parquet表(过程中转换为Parquet)

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

最后,我再次检查了数据转换是否正确,并对 myDB.parquet_test . 为了100%确定数据在Parquet地板上,我去了 /my/path/to/parquet 我仔细检查了一下那些文件是否在Parquet地板里。我不确定你的问题是不是因为你没有跳过文件的头或者你正在使用的版本,但是我刚才解释的这些步骤还是很好的。

polhcujo

polhcujo5#

matthieu lieber的答案描述了如何将数据加载到Parquet地板表。
在你发布下一个问题之前有几件事。
请说明您使用的版本。parquet在0.13之前的配置单元版本中本机不受支持,您需要添加一些显式jar来获得功能。
请添加日志/错误消息。““失败”是对错误的模糊描述,它使调试变得困难。您加载数据的方式看起来还可以,应该可以。然而,一份日志会让事情清楚地表明问题所在。
如果这仍然是一个悬而未决的问题,您可以参考cloudera的文档,了解如何将parquet与hive结合使用的一些基础知识。
谢谢!

相关问题