首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark Partitioning Hive表

Spark Partitioning Hive表
EN

Stack Overflow用户
提问于 2019-06-13 08:37:57
回答 2查看 4.5K关注 0票数 3

我正在尝试使用不同的时间戳对hive表进行分区。我有一个带有时间戳的表,但是当我执行hive分区查询时,它告诉我它不是有效的分区列。下面是表格:

代码语言:javascript
复制
+---+-----------------------+
|id |rc_timestamp           |
+---+-----------------------+
|1  |2017-06-12 17:18:39.824|
|2  |2018-06-12 17:18:39.824|
|3  |2019-06-12 17:18:39.824|
+---+-----------------------+
代码语言:javascript
复制
spark.sql("SET hive.exec.dynamic.partition.mode=nonrestrict")

val tempTable  = spark.sql("SELECT * FROM partition_table")

val df = tempTable.select("rc_timestamp")

val a = x.toString().replaceAll("[\\[\\]]","")

df.collect().foreach(a => {
  spark.sql(s"ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION 
  (rc_timestamp = '$a')").show()
)}

下面是我得到的错误:

代码语言:javascript
复制
org.apache.spark.sql.AnalysisException: rc_timestamp is not a valid partition column 
in table mydb.partition_table.;
EN

回答 2

Stack Overflow用户

发布于 2019-06-14 00:04:11

第一件事是使用这个InsertSuite test case特别是this检查语法

AFAIK您需要msck修复或刷新表

代码语言:javascript
复制
spark.sql(s"refresh table tableNameWhereYouAddedPartitions")

它所做的是刷新现有的分区。

您可以使用spark.sql('MSCK REPAIR TABLE table_name')

有一种叫做recoverPartitions的东西(只适用于分区表,而不适用于视图)。这是msck repair table的别名版本。你可以继续尝试这个..

从文档上看,这个ddl.scala似乎等同于它。

示例用法:

代码语言:javascript
复制
spark.catalog.recoverPartitions(tableName) 

注: RECOVER PARTITIONS子句自动识别这些新目录中存在的任何数据文件,这与REFRESH语句所做的相同。

票数 2
EN

Stack Overflow用户

发布于 2019-06-13 20:07:37

您不能更改Hive表的分区方案。这将不得不重写完整的数据集,因为分区映射到HDFS/S3/FileSystem中的文件夹。

如果想要更改分区方案,惟一的选择是创建一个新表,并在create table命令中提供分区信息。之后,您必须将旧表中的数据插入到新表中。您也可以使用CTAS命令来执行相同的操作。

ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION <(rc_timestamp = '$a')> -命令仅在元存储中为现有分区配置单元表添加新分区。例如,假设您有一个在列year上分区的表T1。如果您想让metastore知道"year=2018",则使用此命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56571968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档