我试图从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)
在配置单元中保存数据时,应该指定保存模式。
df.write.mode(SaveMode.Append)
.format("parquet")
.bucketBy(numBuckets,col1,col2)
.sortBy(col1)
.insertInto(hiveTableName);
Spark提供以下保存模式:
保存模式
ErrorIfExists
:如果目标已存在,则引发异常。如果目标不存在,写出数据。
Append
:如果目标已经存在,则将数据附加到它。如果数据不存在,则将数据写入。
覆盖
:如果目标已存在,请删除目标。把数据写出来。
忽略
:如果目标已经存在,则无提示地跳过写入。否则,写出数据。
您正在使用saveAsTable
API,它将表创建到配置单元中。由于您已经通过命令创建了配置单元表,因此表tab1
已经存在。所以,当Spark API试图创建它时,它抛出错误,表示表已经存在,org。阿帕奇。火花sql。AnalysisException:表
tab1已存在
要么放下表格,让spark API
saveAsTable
自己创建表格。或者使用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?我可以使用使用我的功能的用户所连接的当前连接吗?