Hadoop 如何查询以拼花为输入格式的配置单元表?

Hadoop 如何查询以拼花为输入格式的配置单元表?,hadoop,hive,Hadoop,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,

我创建了一个配置单元表,如下所示:

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命令:

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

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

不确定您是如何加载数据的,但如果您有csv,请将其放在hdfs上。在以文本形式存储的目录上创建外部表。创建您的拼花表,您可以插入,然后hive将结果数据集存储为拼花

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;

不确定您是如何加载数据的,但如果您有csv,请将其放在hdfs上。在以文本形式存储的目录上创建外部表。创建您的拼花表,您可以插入,然后hive将结果数据集存储为拼花

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;

正如@AM_Hawk所建议的,如果您有csv,那么您只需在创建表中使用存储为文本文件的
。如下所示:

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';
错误清楚地表明,它无法找到任何拼花地板文件

如果您确实需要拼花,那么您可以使用Spark将您的蜂巢数据写入拼花文件,如下所示,并按照@AM_Hawk在其回答中的建议在其上创建蜂巢模式:

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

正如@AM_Hawk所建议的,如果您有csv,那么您只需在创建表中使用存储为文本文件的
。如下所示:

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';
错误清楚地表明,它无法找到任何拼花地板文件

如果您确实需要拼花,那么您可以使用Spark将您的蜂巢数据写入拼花文件,如下所示,并按照@AM_Hawk在其回答中的建议在其上创建蜂巢模式:

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

您是如何“加载”数据的?Sqoop——作为拼花地板?@AM_Hawk我添加了我使用的加载命令。您是如何“加载”数据的?Sqoop——作为拼花地板?@AM_Hawk,我添加了我使用的加载命令。