【问题标题】:Hive SaveAsTable creates a new Parquet table file for every runHive SaveAsTable 为每次运行创建一个新的 Parquet 表文件
【发布时间】:2026-02-23 10:20:05
【问题描述】:

我有以下 Scala 代码,用于将数据从 json 文件写入 Hive 中的表。 导入 org.apache.spark.SparkConf 导入 org.apache.spark.sql.SQLContext

val conf = new SparkConf().setAppName("App").setMaster("local")

import org.apache.spark.sql.hive._

val hiveContext = new HiveContext(sc)
val stg_comments = hiveContext.read.schema(buildSchema()).json(<path to json file)

comment.write.mode("append").saveAsTable(<table name>)

我的 json 数据的字段值中有换行符和回车符,因此,我不能简单地在 Hive 中插入记录(因为 Hive 表默认情况下不在数据值中存储换行符和回车符),因此,我需要使用 SaveAsTable 选项。这里的问题是,每次读取一个 json 文件并将新记录附加到现有表时,都会在 Hive 仓库目录的表目录中创建一个新的 parquet 文件。这会导致目录中的实木复合地板文件非常小。我希望将数据附加到现有的镶木地板文件中。我们知道该怎么做吗?谢谢!

【问题讨论】:

    标签: scala apache-spark hive parquet


    【解决方案1】:

    这是预期的行为。这里没有附加到现有文件选项。每个作业都有自己的一组任务,每个任务都有自己的输出文件。 repartitioning 重写之前可以减少写入的文件数量,但不会阻止创建新文件。

    如果文件数量成为问题,您必须运行单独的作业来读取现有的小文件并合并成更大的块。

    【讨论】:

    • 谢谢!如何在不创建新表的情况下将小文件合并成更大的块?
    最近更新 更多