目前用spark生成了parquet 格式文件:
文件元数据A:(id:string,ts String,url String,ref String)
生成的rdd 调用saveAsParquetFile 方法保存为文件。
hive 建立外部表:
tbl_a (id string,ts string,url string,ref string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION .....
hive 查询没问题 结果正确,
现在 建立tbl_b (id string,ref string) ... 其他都类似tbl_a
hive 直接查询 tbl_b 结果显示正常,并且的确是ref 字段。
现在通过 mr 来读取tbl_b 的数据:
...
...
HCatSchema schema;
protected void setup(Mapper<WritableComparable, HCatRecord, Text, IntWritable>.Context context) throws IOException,
InterruptedException {
this.schema = HCatInputFormat.getTableSchema(context.getConfiguration());
}
protected void map(WritableComparable key, HCatRecord value,
Mapper<WritableComparable, HCatRecord, Text, IntWritable>.Context context) throws IOException, InterruptedException {
String ref=value.getString("ref", this.schema);
结果 ref 实际上输出的是ts 字段,这个地方弱智的按字段顺序来读取数据了。
按道理hive 能正确读取,hcatlog 问题也应该不大。
parquet 本来文件就是自我描述的,hive读取数据也证明了这一点,但是hcatlog 就不行了,直接按字段顺序来读取了
这个文件大家遇到过的吗?有什么办法解决没?
ps 环境信息 :
sparak 版本为1.2 和1.3
hive 0.14
hadoop 2.6/2.7
/usr/hdp/2.3.0.0-2557/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.2.1.2.3.0.0-2557.jar
|