【问题标题】:Read Hive table and transform it to Parquet Table读取 Hive 表并将其转换为 Parquet 表
【发布时间】:2019-06-06 14:37:46
【问题描述】:

数据来自 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 

希望有人可以帮助我

【问题讨论】:

  • 您是否要追加到已经存在的表?如果是这样,它将提取现有表的属性并使用这些属性。
  • 我没有附加到已经存在的表或表中。基本上我的问题是,如何将带有 HiveSequenceFileOutputFormat 的表格格式更改为带有 MapredParquetOutputFormat 的新表格?希望这能澄清一点。

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


【解决方案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 语句(一个接一个)。

【讨论】:

  • 你能举个例子吗?至少感谢您的回答:)
猜你喜欢
  • 2015-08-04
  • 2020-11-04
  • 1970-01-01
  • 2016-03-16
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多