我在 Spark 中有具有属性 id 和 name(带有数据(的表employee_1
,以及另一个具有相同属性的表employee_2
,我想通过增加 id 值来加载数据+1
我的 With 子句如下所示:
WITH EXP AS (SELECT ALIASNAME.ID+1 ID, ALIASNAME.NAME NAME FROM employee_1 ALIASNAME)
INSERT INTO TABLE employee_2 SELECT * FROM EXP;
执行步骤:
我在 HDFS 位置有一个文件(带有数据(。
- 基于 hdfs 位置创建 RDD。
- RDD 到 Hive 临时表
- 从临时表到 Hive 目标 (employee_2(。
当我从后端运行测试程序时,它成功了。 但是数据没有加载。 employee_2
为空。
注意:如果在 Hive 中运行上述 with 子句,它将成功并加载数据。但是在火花中它不会在 1.6 ?
不是问题所在,而是导致麻烦的 INSERT INTO 语句。
下面是一个使用 .insertInto(( 样式而不是"INSERT INTO" SQL 的工作示例:
val s = Seq((1,"foo"), (2, "bar"))
s: Seq[(Int, String)] = List((1,foo), (2,bar))
val df = s.toDF("id", "name")
df.registerTempTable("df")
sql("CREATE TABLE edf_final (id int, name string)")
val e = sql("WITH edf AS (SELECT id+1, name FROM df cook) SELECT * FROM edf")
e.insertInto("edf_final")
另一种选择是使用 df.write.mode("append").saveAsTable("edf_final")
样式。
相关所以:"插入..."与 SparkSQL HiveContext
因为答案是针对 Spark 2.x我正在以火花 3 的方式重写
%scala
import org.apache.spark.sql.functions.col
val s = Seq((1,"foo"), (2, "bar"))
val df = s.toDF("id", "name")
df.createOrReplaceTempView("df")
spark.sql("CREATE TABLE if not exists edf_final (id int, name string)")
val e = spark.sql("WITH edf AS (SELECT id+1 AS id, name FROM df) SELECT * FROM edf")
e.select(col("id"), col("name")).write.insertInto("edf_final")
spark.sql("select * from edf_final").show
结果:
df:org.apache.spark.sql.DataFrame
id:integer
name:string
e:org.apache.spark.sql.DataFrame
id:integer
name:string
+---+----+
| id|name|
+---+----+
| 2| foo|
| 3| bar|
+---+----+