当前位置: 首页 > 知识库问答 >
问题:

配置单元外部表无法看到分区拼花文件

狄宜然
2023-03-14

我正在使用Spark生成拼花文件(通过setid分区,使用Snappy压缩),并将它们存储在HDFS位置。

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

拼花数据文件存储在/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 repair table dimcompany;
spark.sql("SET spark.sql.hive.convertMetastoreParquet=false")

共有1个答案

严柏
2023-03-14

问题是分区列setid使用了大写字母

由于配置单元将其列名转换为小写,因此分区列存储为setid而不是setid。因此,当Hive在区分大小写的数据存储区中搜索分区/文件夹时,它会查找setid=some_value,但没有找到任何东西,因为数据文件夹的格式为setid=some_value

为此,请将setid转换为小写或snake_case。您可以通过对数据帧中的列进行别名来使用此功能:

df.select(
... {{ your other_columns }} ...,
col("SetId").alias("set_id")
)
SET hive.mapred.supports.subdirectories=TRUE;
SET mapred.input.dir.recursive=TRUE;
msck repair table <your_schema.your_table>;
 类似资料: