我正在生成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")
这些都没用,我怎么解决?
1条答案
按热度按时间mcvgt66p1#
问题是你的分区列,
SetId
,使用大写字母。由于配置单元将其列名转换为小写,因此分区列存储为
setid
而不是SetId
. 因此,当hive在区分大小写的数据存储中搜索分区/文件夹时,它会查找setid=some_value
找不到任何内容,因为数据文件夹的格式是SetId=some_value
.要使此工作正常,请转换
SetId
小写或小写。您可以通过在Dataframe中为列设置别名来使用它:在执行create语句之前,您可能还需要根据stackoverflow post设置这些属性
创建表之后,还可以尝试运行