当前位置: 首页 > 知识库问答 >
问题:

从Spark Sql写入配置单元表时出错

秦新立
2023-03-14

我试图从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工作中,我编写了以下代码Dataset df=session。read()。选项(“标题”、“真”)。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个答案

丰赞
2023-03-14

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

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

Spark提供以下保存模式:

保存模式

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

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

覆盖:如果目标已存在,请删除目标。把数据写出来。

忽略:如果目标已经存在,则无提示地跳过写入。否则,写出数据。

游乐池
2023-03-14

您正在使用saveAsTableAPI,它将表创建到配置单元中。由于您已经通过命令创建了配置单元表,因此表tab1已经存在。所以,当Spark API试图创建它时,它抛出错误,表示表已经存在,org。阿帕奇。火花sql。AnalysisException:表tab1已存在

要么放下表格,让spark APIsaveAsTable自己创建表格。或者使用APIinsertInto插入到现有的配置单元表中。

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

 类似资料:
  • 我正在使用Spark SQL读取一个配置单元表,并将其分配给一个scala val 有什么方法可以绕过这个错误吗?我需要将记录插入到同一个表中。 嗨,我试着按建议做,但仍然得到同样的错误。

  • 我试图做一些性能优化的数据存储。这个想法是使用蜂巢的巴克特/集群来桶可用的设备(基于列id)。我目前的方法是从外部表插入数据到表中的拼花文件。结果它应用了巴克特。 我想通过直接从PySpark 2.1将数据摄取到该表中来摆脱中间的这一步。使用SparkSQL执行相同的语句会导致不同的结果。添加cluster by子句 仍然会导致不同的输出文件。 这就引出了两个问题:1)从spark向集群蜂箱表中插

  • 我希望使用Spark结构化流从Kafka读取数据并处理它并写入Hive表。 这确实会创建拼花文件,但是我如何更改它以模拟类似的内容,以便它写入到可以使用(select*from)从配置单元或spark sql读取的表格式中

  • 我试图在配置单元中执行select*from db.abc操作,此配置单元表是使用spark加载的 “它不工作”显示错误: 错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0) 我需要在spark-submit或shell中添加任何属性吗?或者使用spark读取此hiv e表的另一种方

  • 我在java中开发了一个工作正常的配置单元udf,我的函数返回输入与配置单元表中列之间的最佳匹配,因此它有以下简化的伪代码: 我的问题是,如果这个函数是由Hive调用的,为什么我需要在代码中连接到Hive?我可以使用使用我的功能的用户所连接的当前连接吗?