【问题标题】:How to access nested attributed in spark sql如何访问 spark sql 中的嵌套属性
【发布时间】:2016-08-17 05:34:24
【问题描述】:

我正在尝试访问存储在表(镶木地板)中的 json 文件的嵌套属性。我可以通过以下方式访问表的所有记录 从测试中选择 *;

但是,我无法通过将查询编写为来访问嵌套属性: val tab= sqlContext.sql("select text, user.screen_name from test LIMIT 1")

架构如下:

|-- text: string (nullable = true)
 |    |-- truncated: boolean (nullable = true)
 |    |-- user: struct (nullable = true)
 |    |    |-- created_at: string (nullable = true)
 |    |    |-- id: long (nullable = true)
 |    |    |-- id_str: string (nullable = true)
 |    |    |-- is_translator: boolean (nullable = true)
 |    |    |-- lang: string (nullable = true)
 |    |    |-- location: string (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- screen_name: string (nullable = true)

下面是我的代码:

import scala.tools.nsc.doc.model.Object
import scala.tools.nsc.interactive.Main
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.sql._
import org.apache.spark.sql.SQLContext


object SimpleSparkSQL {
 def main(args:Array[String]) {
val path = args(0);
val conf = new SparkConf().setAppName("Simple         Application").setMaster("local[2]").set("spark.executor.memory", "1g") 
val sc = new SparkContext(conf)
val data = sc.textFile(path)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._

val sqlc = new SQLContext(sc)
val df = sqlc.read.json(data)

df.select("text",    "user.screen_name").write.format("parquet").save("staging.parquet")
val parquetFile = sqlContext.read.parquet("staging.parquet")
parquetFile.registerTempTable("test")
//= 514621627494322176  where user.screen_name='abyschan'
val tab= sqlContext.sql("select * from test LIMIT 1")
df.printSchema()
tab.collect().foreach{println}

  } 

}

注意:从测试中选择 * 工作正常,但是当我尝试选择 user.screen_name(嵌套属性)时,我收到“无法解析 user.screen_name”的错误

【问题讨论】:

  • 您可能应该在问题中包含您期望的行为以及实际得到的行为。在这里查看有关提问的提示 [ask}

标签: json apache-spark apache-spark-sql parquet


【解决方案1】:

根据您的架构,您应该选择text.user.screen_name

【讨论】:

    【解决方案2】:

    我使用了下面的查询并且它有效。

    val tab= sqlContext.sql("select screen_name, count(text) from test group by screen_name DESC LIMIT 1"

    它只使用 screen_name,但不需要使用 user.screen_name。由于我在镶木地板表中展平了 json 数据,因此不再需要“。”访问 json 的嵌套属性。

    【讨论】:

    • 正确。由于您正在创建表,因此您不必使用 user.screen_name 但只需 screen_name 即可。
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多