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表