hadoop Spark是否像SQL一样支持WITH子句?

g6baxovj  于 6个月前  发布在  Hadoop
关注(0)|答案(2)|浏览(114)

我在Spark中有一个表employee_1,它有属性id和name(带有数据),还有一个表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位置有一个文件(包含数据)。
1.根据HDFS位置创建RDD。

  1. RDD到Hive临时表
    1.从临时表到配置单元目标(配置单元_2)。
    当我从后台运行一个测试程序时,它成功了。但是数据没有加载。employee_2是空的。
    注意事项:
    如果你在Hive中运行上面的 WITH 子句,它会成功,数据会加载。但在Spark中,它不会在1.6中。为什么?
irlmq6kh

irlmq6kh1#

WITH语句不是问题所在,而是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")样式。
相关SO:"INSERT INTO ..." with SparkSQL HiveContext

ma8fv8wu

ma8fv8wu2#

因为答案是针对Spark 2.x的,所以我以Spark 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|
+---+----+

相关问题