如何查询具有镶木地板作为inputformat的Hive表?

时间:2017-03-17 17:11:50

标签: hadoop hive

我创建了一个hive表,如下所示:

create table parqtab(id int, name char(30), city char(30))
  partitioned by (country char(30))
  row format delimited
  fields terminated by ','
  stored as parquet
  location '/home/hive/practice';

并加载以下数据:

3,Bobby,London
4,Sunny,Amsterdam

使用加载命令:

load data local inpath '/home/cloudera/Desktop/hid' into table parqtab partition(country='abcd');

当我从parqtab查询select *时,它给出了以下错误:

Failed with exception java.io.IOException:java.lang.RuntimeException: 
hdfs://quickstart.cloudera:8020/home/hive/practice/country=abcd/hid is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [111, 114, 101, 10]
Time taken: 0.227 seconds

我知道查询以镶木地板格式存储的数据不是正确的方法。但我不明白该怎么做。谁能告诉我我在这里犯的错误是什么以及如何正确查询表格?

2 个答案:

答案 0 :(得分:2)

不知道你是如何加载数据的,但如果你有一个csv就把它放在hdfs上。在该目录上创建一个以文本形式存储的外部表。创建镶木桌子,你可以插入,然后蜂巢将结果数据集存储为镶木地板。

CREATE EXTERNAL TABLE db_name.tbl0(
col0    INT,
col1    VARCHAR(255)
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
LOCATION '/someDir/tbl0';

CREATE EXTERNAL TABLE db_name.tbl1(
col0    INT,
col1    VARCHAR(255) 
)
STORED AS PARQUET
LOCATION '/someDir/tbl1';
;

INSERT INTO TABLE tbl1
select * from tbl0;

答案 1 :(得分:0)

正如@AM_Hawk建议的那样,如果您有csv,那么您应该只在创建表中使用STORED AS TEXTFILE。如下所示:

create external table parqtab(id int, name char(30), city char(30))
partitioned by (country char(30))  
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE 
LOCATION '/home/hive/practice';

错误清楚地表明它无法找到任何镶木地板文件。

如果您确实需要Parquet,那么您可以使用Spark编写您的hive数据作为镶木地板文件,并在其上创建一个Hive模式,如@AM_Hawk在他的回答中所建议的那样:

val iSql="your hive select statement"
val hiveDF = hsc.sql(iSql)
hiveDF.coalesce(noExecutors).write.mode("append/overwrite").parquet(parquetLoc)