我在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...
现在,我尝试在配置单元中创建一个外部表,如下所示:
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壳下,当我奔跑时:
val results = sqlContext.read.format("orc").load("/tmp/out/*/part*")
results.registerTempTable("results")
sqlContext.sql("select count(*) from results").show
我得到了500000行。
好像“分区”没有被认出来什么的。如何在spark中创建的数据之上创建“外部”配置单元表?
1条答案
按热度按时间voase2hg1#
配置单元不会自动找到新分区。创建新分区后,需要更新配置单元表。一旦创建了分区并将其添加到配置单元表中,就可以根据需要在该分区中添加和删除文件,这些更改将立即反映出来,而无需更新元存储。
你可以使用
ALTER TABLE
查询以在元存储中创建新分区。您将需要对每个输出目录执行此查询,以便hive将它们提取出来。
但是,hive对其分区有一个标准的命名约定
<column_name>=<value>
. 使用这种命名方案有两个优点。首先,你可以省略LOCATION
合同条款ALTER TABLE
但它也允许您使用不同的查询:MSCK REPAIR TABLE <table_name>
它将所有目录作为分区添加到元存储中。如果您想一次添加多个分区,这非常有用,这意味着您不需要知道要添加的所有分区列的值。