7

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

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;

它失败。有什么想法吗?

4

5 回答 5

5

我将分享我刚刚测试过的东西,它工作得很好。我知道这可能是 Hive 目前可以解决的版本相关问题。无论如何,我会解释我刚刚做了什么,

1.检查原始数据

$猫我的文件.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表(过程中转换为parquet)

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

最后,我通过对myDB.parquet_test. 为了 100% 确定数据在 Parquet 中,我去/my/path/to/parquet并仔细检查了这些文件是否真的在 Parquet 中。不确定您的问题是否是因为您没有跳过文件的标题或您正在使用的版本,但同样,我刚刚解释的这些步骤效果很好。

于 2018-04-30T21:46:50.560 回答
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>
于 2014-04-26T16:10:32.910 回答
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> 
于 2015-02-09T22:12:48.893 回答
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>
    
于 2014-12-10T07:15:58.820 回答
0

Matthieu Lieber 的回答描述了如何将数据加载到镶木地板表中。

在您发布下一个问题之前先做几件事。

  1. 请说明您使用的是什么版本。Parquet 在 0.13 之前的 Hive 版本中不受本机支持,您需要添加一些显式 jar 来获得该功能。

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

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

谢谢!

于 2015-09-02T11:51:24.113 回答