【问题标题】:Error While Writing into a Hive table from Spark Sql从 Spark Sql 写入 Hive 表时出错
【发布时间】:2018-10-10 02:35:25
【问题描述】:

我正在尝试从 Spark Sql 将数据插入 Hive 外部表。 我通过以下命令创建了 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 工作中,我编写了以下代码 数据集 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-spark hive


    【解决方案1】:

    在将数据保存在 hive 中时,您应该指定 保存模式

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

    Spark 提供以下保存模式:

    保存模式

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

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

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

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

    【讨论】:

    • insertInto 对我来说可能不是一个选择,因为我的桌子上有桶。有办法规避吗?
    【解决方案2】:

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

    要么删除表,让 spark API saveAsTable 自己创建表。 或者使用 API insertInto 插入到现有的 Hive 表中。

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

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2019-03-09
      • 2020-12-30
      • 2019-05-30
      • 2017-07-13
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多