Json 如何访问spark sql中的嵌套属性

Json 如何访问spark sql中的嵌套属性,json,apache-spark,apache-spark-sql,parquet,Json,Apache Spark,Apache Spark Sql,Parquet,我试图访问存储在表(拼花地板)中的json文件的嵌套属性。我可以通过以下方式访问表中的所有记录: 从测试中选择* 但是,我无法通过以下方式写入查询来访问嵌套属性: val tab=sqlContext.sql(“从测试限制1中选择文本,user.screen\u名称”) 方案如下: |-- text: string (nullable = true) | |-- truncated: boolean (nullable = true) | |-- user: struct (nu

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

但是,我无法通过以下方式写入查询来访问嵌套属性: val tab=sqlContext.sql(“从测试限制1中选择文本,user.screen\u名称”)

方案如下:

|-- 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}

  } 

}

注意:Select*from test工作正常,但当我尝试选择user.screen\u name(嵌套属性)时,我得到了错误“无法解析user.screen\u name”

根据您的模式,您应该选择
text.user.screen\u name

,我在下面的查询中使用了它,它工作正常

val tab=sqlContext.sql(“按屏幕名称描述限制1从测试组中选择屏幕名称、计数(文本)”


它只使用screen_name工作,但不需要使用user.screen_name。由于我已将拼花地板表中的json数据展平,因此它不再需要“.”来访问json的嵌套属性。

您可能应该在问题中包括您期望的行为和实际得到的行为。请在此处查看as上的指针king questions[ask}正确。因为您正在创建表,所以不必使用user.screen\u name,只需使用screen\u name即可。