我正在尝试从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)
答案 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
:如果目标已经存在,请静默跳过写出。否则写出数据。