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

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 中创建一个外部 table,如下所示:

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 行。

似乎 'Partitions' 没有被识别或什么的。如何在 Spark 中创建的数据之上创建 'External' Hive table?

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

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

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