【问题标题】:Spark Partitioning Hive TableSpark 分区 Hive 表
【发布时间】:2019-10-27 13:04:05
【问题描述】:

我正在尝试使用不同的时间戳对配置单元表进行分区。我有一个带有时间戳的表,但是当我执行配置单元分区查询时,它说它不是有效的分区列。这是表格:

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

【问题讨论】:

  • 请您发布表格定义吗?
  • spark.sql("CREATE TABLE part_table (id INT, rc_timestamp timestamp)")
  • 请创建一个带分区的表。参考这里创建一个分区表cwiki.apache.org/confluence/display/Hive/…
  • 我已经有一个原始表中有数百万条记录的表,所以我试图更改表以添加分区。这不是有效的语法吗:“ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION (rc_timestamp = '$a')”
  • 这是一个有效的语法。但是你不能在非分区表上使用它

标签: scala apache-spark hive apache-spark-sql hiveql


【解决方案1】:

首先是使用InsertSuite test case 特别是this 检查你的语法

AFAIK 你需要 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 语句一样。

【讨论】:

【解决方案2】:

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

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

ALTER TABLE mydb.partition_table ADD IF NOT EXISTS PARTITION <(rc_timestamp = '$a')> - 命令仅在 Metastore 中为现有分区 Hive 表添加新分区。例如,假设您有一个表T1,它在列year 上进行分区。如果您想让 Metastore 了解“year=2018”,则使用此命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-02-06
    相关资源
    最近更新 更多