【问题标题】:Hive external tables not able to see partitioned Parquet filesHive 外部表无法查看分区 Parquet 文件
【发布时间】:2018-07-24 11:48:38
【问题描述】:

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

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

Parquet数据文件存放在/some-hdfs-path/testsp下

然后我为它创建 Hive 表,如下所示:

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');

但是,当我在 Hive 中的 table 上选择时,它不显示任何结果。

我试过了:

  1. 运行msck 命令,如:

    msck repair table dimcompany;
    
  2. 设置如下:

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

这些都不起作用,我该如何解决?

【问题讨论】:

    标签: apache-spark hive partitioning parquet


    【解决方案1】:

    问题在于您的分区列SetId 使用大写 字母。

    由于 Hive 将其列名转换为小写,因此您的分区列存储为 setid 而不是 SetId。因此,当 Hive 在区分大小写的数据存储中搜索分区/文件夹时,它会查找 setid=some_value,但什么也找不到,因为您的数据文件夹的格式为 SetId=some_value。

    要完成这项工作,请将SetId 转换为小写或snake_case。您可以通过为 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>;
    

    【讨论】:

    • 我自己遇到了这个问题 - 根本原因归功于 Anuvrat Singh 在 Medium 上的文章
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 2023-03-19
    • 2022-01-07
    • 2020-07-19
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多