读取Hive表并将其转换为Parquet Table

时间:2019-01-11 16:28:52

标签: apache-spark hive apache-spark-sql parquet

确切地说,数据来自Hive表

第一个表具有属性

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

此表应转换为镶木地板并具有属性

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 

希望有人能帮助我

1 个答案:

答案 0 :(得分:1)

您不能在同一张表中混合使用不同的文件格式,也不能更改其中包含数据的表的文件格式。 (更确切地说,您可以执行这些操作,但是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;

您可以直接在Hive会话中执行这些SQL语句,也可以使用spark.sql(...)语句(一个接一个地)从Spark执行这些SQL语句。