scala—在spark中创建的数据之上创建配置单元表

tpxzln5u  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(299)

我在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中创建的数据之上创建“外部”配置单元表?

voase2hg

voase2hg1#

配置单元不会自动找到新分区。创建新分区后,需要更新配置单元表。一旦创建了分区并将其添加到配置单元表中,就可以根据需要在该分区中添加和删除文件,这些更改将立即反映出来,而无需更新元存储。
你可以使用 ALTER TABLE 查询以在元存储中创建新分区。

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> 它将所有目录作为分区添加到元存储中。如果您想一次添加多个分区,这非常有用,这意味着您不需要知道要添加的所有分区列的值。

相关问题