无法从Spark向Hive分区表插入数据

3

我在Hive中创建了一个外部分区表。日志中显示numinputrows,这意味着查询正在工作并发送数据。但是,当我使用Beeline连接到Hive并查询select *或count(*)时,结果总是为空。

def hiveOrcSetWriter[T](event_stream: Dataset[T])( implicit spark: SparkSession): DataStreamWriter[T] = {

    import spark.implicits._
    val hiveOrcSetWriter: DataStreamWriter[T] = event_stream
      .writeStream
      .partitionBy("year","month","day")
      .format("orc")
      .outputMode("append")
      .option("compression", "zlib")
      .option("path", _table_loc)
      .option("checkpointLocation", _table_checkpoint)

    hiveOrcSetWriter
  }

有什么问题吗?我无法理解。

1
可能是Spark SQL saveAsTable返回空结果的重复问题。 - zero323
2个回答

1

您的流式作业正在将新分区写入table_location。但是Hive元存储不知道这一点。

当您在表上运行选择查询时,Hive会检查元存储以获取表分区列表。由于元存储中的信息已过时,因此数据不会显示在结果中。

您需要运行 -

ALTER TABLE <TABLE_NAME> RECOVER PARTITIONS

来自Hive/Spark的命令,用于更新元数据存储中的新分区信息。

@Sam,你能否检查一下答案并确认是否适用于你? - moriarty007
是的,我检查了 ALTER TABLE 没有起作用,但是 msck repair 命令有效。 - Sam

1
msck repair table tablename

它会去检查表的位置并添加新的分区,如果有的话。

在你的Spark处理过程中添加这一步骤,以便从Hive查询。


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