Apache spark Dataset的as方法到底意味着什么
我有简单的代码:Apache spark Dataset的as方法到底意味着什么,apache-spark,Apache Spark,我有简单的代码: test("Dataset as method") { val spark = SparkSession.builder().master("local").appName("Dataset as method").getOrCreate() import spark.implicits._ //xyz is an alias of ds1 val ds1 = Seq("1", "2").toDS().as("xyz") //xyz
test("Dataset as method") {
val spark = SparkSession.builder().master("local").appName("Dataset as method").getOrCreate()
import spark.implicits._
//xyz is an alias of ds1
val ds1 = Seq("1", "2").toDS().as("xyz")
//xyz can be used to refer to the value column
ds1.select($"xyz.value").show(truncate = false)
//ERROR here, no table or view named xyz
spark.sql("select * from xyz").show(truncate = false)
}
在我看来,xyz就像一个表名,但sql select*from xyz会引发一个错误,抱怨xyz不存在
所以,我想问,as方法到底意味着什么?以及我应该如何使用别名,如我的示例中的xyz。与您的示例中的dataset一起使用时,是一个为dataset创建别名的函数,如api文档中所示
只能在函数API中使用,如选择、加入、筛选等,但别名不能用于sql查询
如果您创建两列数据集并像以前那样使用alias,则更明显
val ds1 = Seq(("1", "2"),("3", "4")).toDS().as("xyz")
现在,您可以使用select仅选择一列,并将别名用作
应该给你什么
+---+
|_1 |
+---+
|1 |
|3 |
+---+
当您连接具有相同列名的两个数据集时,as别名的使用更为明显,您可以在其中编写使用别名连接的条件
但要在sql查询中使用alias,必须注册表
ds1.registerTempTable("xyz")
spark.sql("select * from xyz").show(truncate = false)
这会给你正确的结果
+---+---+
|_1 |_2 |
+---+---+
|1 |2 |
|3 |4 |
+---+---+
或者最好用一种新的方式来做
ds1.createOrReplaceTempView("xyz")
.as与dataset一起使用时,在您的案例中,是一个为dataset创建别名的函数,如api文档中所示
只能在函数API中使用,如选择、加入、筛选等,但别名不能用于sql查询
如果您创建两列数据集并像以前那样使用alias,则更明显
val ds1 = Seq(("1", "2"),("3", "4")).toDS().as("xyz")
现在,您可以使用select仅选择一列,并将别名用作
应该给你什么
+---+
|_1 |
+---+
|1 |
|3 |
+---+
当您连接具有相同列名的两个数据集时,as别名的使用更为明显,您可以在其中编写使用别名连接的条件
但要在sql查询中使用alias,必须注册表
ds1.registerTempTable("xyz")
spark.sql("select * from xyz").show(truncate = false)
这会给你正确的结果
+---+---+
|_1 |_2 |
+---+---+
|1 |2 |
|3 |4 |
+---+---+
或者最好用一种新的方式来做
ds1.createOrReplaceTempView("xyz")
您缺少没有表注册的临时表注册,但我可以选择ds1。选择$xyz.value.showtruncate=false是。。。xyz是其中的一列,而不是一个表。ds1是表格。。。请尝试ds1.printSchema。当重命名列时,不注册SparkSQL表您缺少临时表注册而不注册表,但我可以选择ds1。选择$xyz.value.showtruncate=falseYes。。。xyz是其中的一列,而不是一个表。ds1是表格。。。请尝试ds1.printSchema。as重命名列,而不是注册SparkSQL表