gpt4 book ai didi

apache-spark - 对 Spark SQL 查询返回的行的非序访问

转载 作者:行者123 更新时间:2023-12-04 04:12:13 24 4
gpt4 key购买 nike

在 Spark 文档中,声明 Spark SQL 查询的结果是 SchemaRDD。这个 SchemaRDD 的每一行都可以依次访问。我想知道是否有任何方法可以使用构建 SQL 查询的案例类的字段名称来访问列。我很欣赏 case 类与结果无关的事实,特别是如果我选择了单个列和/或为它们设置了别名:但是,通过名称而不是序数访问字段的某种方法会很方便。

最佳答案

一个简单的方法是使用“语言集成”select在生成的 SchemaRDD 上使用方法来选择你想要的列——这仍然会给你一个 SchemaRDD,如果你选择了不止一列,那么你仍然需要使用序数,但你总是可以一次选择一列.例子:

// setup and some data
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
case class Score(name: String, value: Int)
val scores =
sc.textFile("data.txt").map(_.split(",")).map(s => Score(s(0),s(1).trim.toInt))
scores.registerAsTable("scores")

// initial query
val original =
sqlContext.sql("Select value AS myVal, name FROM scores WHERE name = 'foo'")

// now a simple "language-integrated" query -- no registration required
val secondary = original.select('myVal)
secondary.collect().foreach(println)

现在 secondary是一个只有一列的 SchemaRDD,尽管原始查询中有别名,但它仍然有效。

编辑:但请注意您 可以 注册生成的 SchemaRDD 并使用直接的 SQL 语法查询它,而不需要另一个案例类。
original.registerAsTable("original")
val secondary = sqlContext.sql("select myVal from original")
secondary.collect().foreach(println)

第二次编辑:一次处理一行 RDD 时,可以使用匹配语法按名称访问列:
val secondary = original.map {case Row(myVal: Int, _) => myVal}

尽管如果“=>”的右侧需要访问很多列,这可能会变得很麻烦,因为它们每个都需要在左侧进行匹配。 (这来自 source code for the Row companion object 中非常有用的评论)

关于apache-spark - 对 Spark SQL 查询返回的行的非序访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com