从Spark Sql写入Hive表时出错

时间:2018-10-10 02:35:25

标签: apache-spark 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

在我的火花工作中,我编写了以下代码 数据集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)

2 个答案:

答案 0 :(得分:2)

您正在使用saveAsTable API,它将API创建到Hive中。由于您已经通过命令创建了配置单元表,因此表tab1已经存在。因此,当Spark API尝试创建它时,它会抛出错误,指出表已经存在,org.apache.spark.sql.AnalysisException: Table tab1 already exists.

要么删除该表,要么让spark API saveAsTable创建表本身。 或使用API​​ insertInto插入现有的配置单元表中。

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

答案 1 :(得分:1)

在将数据保存在配置单元中时,您应该指定保存模式

df.write.mode(SaveMode.Append)
              .format("parquet")
              .bucketBy(numBuckets,col1,col2)
              .sortBy(col1)
              .insertInto(hiveTableName);

Spark提供以下保存模式:

保存模式

ErrorIfExists:如果目标已经存在,则引发异常。如果目标不存在,则将数据写出。

Append:如果目标已经存在,则将数据附加到该目标。如果数据不存在,则将数据写出。

Overwrite:如果目标已经存在,请删除目标。写出数据。

Ignore:如果目标已经存在,请静默跳过写出。否则写出数据。