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

时间:2016-12-08 19:47:08

标签: scala hadoop apache-spark hive orc

我在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表?

1 个答案:

答案 0 :(得分:1)

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

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

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

您需要对每个输出目录执行此查询,以便Hive将其选中。

但是,Hive对其分区<column_name>=<value>有一个标准的命名约定。使用此命名方案有几个优点。首先,您可以省略LOCATION查询中的ALTER TABLE子句,但它也允许您使用不同的查询:MSCK REPAIR TABLE <table_name>,它将所有目录作为分区添加到Metastore中。如果要一次添加多个分区,这意味着您不需要知道要添加的所有分区列的值,这非常有用。