首页 > 解决方案 > 从 Spark Sql 写入 Hive 表时出错

问题描述

我正在尝试从 Spark Sql 将数据插入 Hive 外部表。我通过以下命令创建了配置单元外部表

CREATE EXTERNAL TABLE  tab1 ( col1 type,col2 type ,col3 type) CLUSTERED BY (col1,col2) SORTED BY (col1) INTO 8 BUCKETS STORED AS PARQUET

在我的 spark 工作中,我编写了以下代码 Dataset df = session.read().option("header","true").csv(csvInput);

df.repartition(numBuckets, somecol)
                  .write()
                  .format("parquet")
                  .bucketBy(numBuckets,col1,col2)
                  .sortBy(col1)
                  .saveAsTable(hiveTableName);

每次我运行此代码时,我都会收到以下异常

org.apache.spark.sql.AnalysisException: Table `tab1` already exists.;
    at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:408)
    at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:393)
    at somepackage.Parquet_Read_WriteNew.writeToParquetHiveMetastore(Parquet_Read_WriteNew.java:100)

标签: apache-sparkhive

解决方案


您正在使用saveAsTableAPI,它将表创建到 Hive 中。由于您已经通过命令创建了 hive 表,因此该表tab1已经存在。所以当 Spark API 试图创建它时,它会抛出错误,说表已经存在,org.apache.spark.sql.AnalysisException: Tabletab1already exists.

要么删除表,让 spark APIsaveAsTable自己创建表。或者使用 APIinsertInto插入现有的配置单元表。

df.repartition(numBuckets, somecol)
                  .write()
                  .format("parquet")
                  .bucketBy(numBuckets,col1,col2)
                  .sortBy(col1)
                  .insertInto(hiveTableName);

推荐阅读