繁体   English   中英

在Spark中创建的数据之上创建Hive表

[英]Create Hive table on top of data created in Spark

我已经在Spark下以ORC格式创建了数据,如下所示:

var select: String = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160101")
select = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160102")
& so on...

现在,我试图在Hive中创建一个外部表,如下所示:

CREATE EXTERNAL TABLE `mydb.mytable`
 (`col1` string, 
  `col2` decimal(38,0), 
  `create_date` timestamp, 
  `update_date` timestamp)
  PARTITIONED BY (`my_date` string)
  STORED AS ORC
  LOCATION '/tmp/out/';

当我做:

"select count(*) from mydb.mytable"

我得到的计数值为0。但是在Spark-shell下,当我运行时:

val results = sqlContext.read.format("orc").load("/tmp/out/*/part*")
results.registerTempTable("results")
sqlContext.sql("select count(*) from results").show

我得到了500,000行。

似乎“分区”未得到识别或类似的东西。 如何在Spark中创建的数据之上创建“外部” Hive表?

Hive不会自动查找新分区。 创建新分区后,需要更新配置单元表。 一种是创建分区并将其添加到配置单元表中,您可以根据需要在该分区中添加和删除文件,这些更改将立即反映出来,而无需更新Metastore。

您可以使用ALTER TABLE查询在元存储中创建新分区。

ALTER TABLE mydb.mytable 
ADD PARTITION (my_date='20160101')
LOCATION '/tmp/out/20160101'

您将需要对每个输出目录执行此查询,以便Hive可以选择它们。

但是,Hive对于其分区<column_name>=<value>具有标准的命名约定。 使用这种命名方案有两个优点。 首先,您可以从ALTER TABLE查询中省略LOCATION子句,但它也允许您使用其他查询: MSCK REPAIR TABLE <table_name> ,它将所有目录作为分区添加到metastore中。 如果您要一次添加多个分区,并且不需要知道要添加的所有分区列的值,则这很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM