apache-spark - 从 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)
解决方案
您正在使用saveAsTable
API,它将表创建到 Hive 中。由于您已经通过命令创建了 hive 表,因此该表tab1
已经存在。所以当 Spark API 试图创建它时,它会抛出错误,说表已经存在,org.apache.spark.sql.AnalysisException: Table
tab1already exists.
要么删除表,让 spark APIsaveAsTable
自己创建表。或者使用 APIinsertInto
插入现有的配置单元表。
df.repartition(numBuckets, somecol)
.write()
.format("parquet")
.bucketBy(numBuckets,col1,col2)
.sortBy(col1)
.insertInto(hiveTableName);
推荐阅读
- r - 将数据框转换为 mxn 表
- memory-leaks - LeakSanitizer 在简单的 MPI 程序中发现泄漏
- node.js - 如何在 Internet Explorer 中支持表情符号?
- c# - 在没有模拟框架的情况下编写单元测试
- javascript - Messenger 共享导致“Messenger Extensions 意外错误”
- c# - 反序列化 Soap 响应 C#
- html - 以两种方式制作动画
- mongodb - 如何在 MongoDB 中 $lookup 后 $project 特定字段
- c++ - 无法在 VS2017 中打开 DirectX 11 应用程序(通用 Windows)模板 - HResult 0x80042003
- python - 在执行操作时获取单独子数组中的 numpy 子数组的结果,而不使用 for 循环