读取hive表并将其转换为Parquet表

rkttyhzu  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(615)

更准确地说,数据来自一个配置单元表
第一个表具有

Serde Library   org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
InputFormat org.apache.hadoop.mapred.SequenceFileInputFormat    
OutputFormat    org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

这张table应该改造成 parquet ,并具有

Serde Library   org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 
InputFormat org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat   
OutputFormat    org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat

执行以下scala spark代码:

val df = spark.sql("SELECT * FROM table")
df.write.format("parquet").mode("append").saveAsTable("table")

这仍然会导致不需要的属性:

Serde Library   org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  
InputFormat org.apache.hadoop.mapred.SequenceFileInputFormat    
OutputFormat    org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

希望有人能帮我

jvlzgdj9

jvlzgdj91#

不能在同一个表中混合使用不同的文件格式,也不能更改包含数据的表的文件格式(更准确地说,您可以执行这些操作,但是hive和spark都无法读取格式与元数据不匹配的数据。)
您应该将数据写入一个新表,确保它符合您的期望,然后重命名或删除旧表,最后将新表重命名为旧名称。例如:

CREATE TABLE new_table STORED AS PARQUET AS SELECT * FROM orig_table;
ALTER TABLE orig_table RENAME TO orig_table_backup;
ALTER TABLE new_table RENAME TO orig_table;

您可以在配置单元会话中直接执行这些sql语句,也可以使用 spark.sql(...) 陈述(一个接一个)。

相关问题