Spark分区Hive表

3

我正在尝试对带有不同时间戳的Hive表进行分区。 我有一个包含时间戳的表,但当我执行Hive分区查询时,它说这不是有效的分区列。 这是表:

+---+-----------------------+
|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|
+---+-----------------------+

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()
)}

这是我遇到的错误:

org.apache.spark.sql.AnalysisException: rc_timestamp is not a valid partition column 
in table mydb.partition_table.;

请你能否发布表的定义? - Constantine
spark.sql("CREATE TABLE part_table (id INT, rc_timestamp timestamp)")Spark.SQL("创建表part_table(id INT, rc_timestamp timestamp)") - Incognito
请创建一个带有分区的表。请参考以下链接以创建分区表 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTableCreate/Drop/TruncateTable - Constantine
我已经有一个包含数百万条记录的表格,因此我尝试修改该表格以添加分区。不过,这是有效的语法吗:"ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION (rc_timestamp = '$a')"? - Incognito
这是一个有效的语法。但是你不能在非分区表上使用它。 - Constantine
2个回答

2
首先要检查您的语法是否正确,可以使用InsertSuite测试案例,特别是此处
据我所知,您需要使用msck修复或刷新表格。
spark.sql(s"refresh table tableNameWhereYouAddedPartitions")

它的作用是刷新现有的分区。

您可以选择 spark.sql('MSCK REPAIR TABLE table_name')

有一个叫做recoverPartitions的功能(仅适用于分区表,而不是视图)。这是msck repair table的别名版本。您可以尝试使用它。

查看ddl.scala,文档中似乎等效。示例用法:

spark.catalog.recoverPartitions(tableName) 

注意:RECOVER PARTITIONS子句会自动识别这些新目录中存在的任何数据文件,就像REFRESH语句一样。

你接受了那个答案,然后又取消了,我只是想知道原因。你介意告诉我原因吗?你还需要什么吗? - Ram Ghadiyaram

1
您无法更改Hive表的分区方案。这将需要重写完整的数据集,因为分区映射到HDFS / S3 / FileSystem中的文件夹。
如果您想更改分区方案,则唯一的选项是创建一个新表,并在create table命令中提供分区信息。之后,您必须从旧表向新表插入数据。您还可以使用CTAS命令完成相同的操作。 ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION <(rc_timestamp = '$a')>-该命令仅向现有分区的Hive表的元数据中添加新分区。例如,假设您有一个名为T1的表,该表以列year进行分区。如果您想让元数据了解“year = 2018”,则使用此命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接