hive外部表无法看到分区的Parquet文件

kcwpcxri  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(393)

我正在生成Parquet文件(按分区) setid ,使用snappy压缩)使用spark并将它们存储在hdfs位置。

df.coalesce(1).write.partitionBy("SetId").
  mode(SaveMode.Overwrite).
  format("parquet").
  option("header","true").
  save(args(1))

Parquet数据文件存储在 /some-hdfs-path/testsp 然后,我为其创建配置单元表,如下所示:

CREATE EXTERNAL TABLE DimCompany(
  CompanyCode string,
  CompanyShortName string,
  CompanyDescription string,
  BusinessDate string,
  PeriodTypeInd string,
  IrisDuplicateFlag int,
  GenTimestamp timestamp
) partitioned by (SetId int)
STORED AS PARQUET LOCATION '/some-hdfs-path/testsp'
TBLPROPERTIES ('skip.header.line.count'='1','parquet.compress'='snappy');

但是,当我在配置单元的表上选择时,它不会显示任何结果。
我试过:
跑步 msck 命令如下:

msck repair table dimcompany;

设置以下内容:

spark.sql("SET spark.sql.hive.convertMetastoreParquet=false")

这些都没用,我怎么解决?

mcvgt66p

mcvgt66p1#

问题是你的分区列, SetId ,使用大写字母。
由于配置单元将其列名转换为小写,因此分区列存储为 setid 而不是 SetId . 因此,当hive在区分大小写的数据存储中搜索分区/文件夹时,它会查找 setid=some_value 找不到任何内容,因为数据文件夹的格式是 SetId=some_value .
要使此工作正常,请转换 SetId 小写或小写。您可以通过在Dataframe中为列设置别名来使用它:

df.select(
... {{ your other_columns }} ...,
col("SetId").alias("set_id")
)

在执行create语句之前,您可能还需要根据stackoverflow post设置这些属性

SET hive.mapred.supports.subdirectories=TRUE;
SET mapred.input.dir.recursive=TRUE;

创建表之后,还可以尝试运行

msck repair table <your_schema.your_table>;

相关问题