我在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表?
答案 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中。如果要一次添加多个分区,这意味着您不需要知道要添加的所有分区列的值,这非常有用。