Databricks中Hive分区表查询无数据(非重复问题,未用Spark SQL分区)
解决Databricks中手动加载单独Parquet文件到Hive分区表的问题
我明白你现在的处境——在Databricks里建了Hive分区表,却要手动处理单独的Parquet文件,还没法用Hive风格SQL,这确实有点挠头。下面给你一套实用的解决办法:
1. 先确认你的建表逻辑没问题
你给出的建表语句是完全合规的,分区字段datestamp的设置也没问题:
CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING, `datestamp` STRING) USING parquet OPTIONS ( `serialization.format` '1' ) PARTITIONED BY (datestamp)
2. 把单独Parquet文件放到对应分区目录
Databricks的Hive表默认存储路径是dbfs:/user/hive/warehouse/<数据库名>.db/foo_test/(如果是默认数据库,路径就是dbfs:/user/hive/warehouse/foo_test/)。你需要给每个分区值创建对应的子目录,格式是datestamp=<分区值>,然后把你的Parquet文件放进去。
比如你的分区值是2024-05-20,可以用Databricks的工具命令移动文件:
dbutils.fs.mv("dbfs:/your/source/path/single_file.parquet", "dbfs:/user/hive/warehouse/foo_test/datestamp=2024-05-20/")
3. 让Metastore识别新分区
手动放文件后,Hive元数据还不知道这个分区存在,得手动刷新。Databricks支持MSCK REPAIR TABLE命令,它会扫描表的存储路径,自动把新分区添加到元数据里:
MSCK REPAIR TABLE foo_test;
如果你清楚知道分区值,也可以直接手动添加分区,效率更高:
ALTER TABLE foo_test ADD PARTITION (datestamp='2024-05-20');
4. 验证数据是否加载成功
跑个查询看看数据有没有进来:
SELECT * FROM foo_test WHERE datestamp='2024-05-20';
额外推荐:用Spark DataFrame自动写入分区表
如果你是用代码读取单独Parquet文件,其实可以直接用Spark API写入分区表,完全不用手动操作文件,还能自动维护元数据:
from pyspark.sql.functions import lit # 读取单独的Parquet文件 df = spark.read.parquet("dbfs:/your/source/path/single_file.parquet") # 添加分区列,指定对应的值 df_with_partition = df.withColumn("datestamp", lit("2024-05-20")) # 追加写入分区表 df_with_partition.write.mode("append").partitionBy("datestamp").saveAsTable("foo_test")
注意事项
- 确保你的Parquet文件schema和表的schema完全匹配,不然会出现读取失败或者数据错乱的问题;
- 如果表不在默认数据库,记得调整存储路径里的数据库名称,比如
dbfs:/user/hive/warehouse/mydb.db/foo_test/; MSCK REPAIR TABLE对内部表和外部表都适用,不用担心表的类型。
内容的提问来源于stack exchange,提问作者Adam A
相关产品推荐
相关产品推荐

