我有一个hive表模式存储在一个hdfs文件schema.avsc中。 我想创建一个具有相同模式的hive表,并希望从另一个hdfs路径转储数据,其中数据存储在HDFS文件系统中。
1:我怎样才能创建一张桌子? 2:如何将存储在hdfs文件中的数据转储到创建的表中?
答案 0 :(得分:2)
如何创建表格?
AvroSerDe上的Apache Hive文档显示了基于存储在文件中的Avro架构创建表的语法。为方便起见,我将重复其中一个例子:
CREATE TABLE kst
PARTITIONED BY (ds string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='http://schema_provider/kst.avsc');
此示例从Web服务器提取架构文件。该文档还显示了其他选项,例如从本地文件中提取,具体取决于您的具体需求。
我建议您阅读整个AvroSerDe文档页面。有很多有用的信息可以帮助我们最大限度地利用Hive和Hro。
如何将存储在hdfs文件中的数据转储到创建的表中?
您可以定义引用现有HDFS文件的外部表。 External Tables的文档页面显示了语法。重复一个例子:
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User',
country STRING COMMENT 'country of origination')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
STORED AS TEXTFILE
LOCATION '<hdfs_location>';
在定义外部表之后,您可以使用从外部表读取并写入Avro表的INSERT-SELECT查询。 Inserting data into Hive Tables from queries上的文档描述了INSERT-SELECT语法。例如:
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt