2016-04-23 88 views
1

我想访问存储在表(实木复合地板)中的json文件的嵌套属性。我可以通过 select * from test来访问表中的所有记录;如何在火花中访问嵌套的属性sql

然而,我无法通过写入查询来作为访问嵌套属性: VAL标签= sqlContext.sql( “选择文本,user.screen_name从测试LIMIT 1”)

Schema是如下:

|-- 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测试工作正常,但当我尝试选择user.screen_name(嵌套属性)我GETT出现“无法解析user.screen_name”的错误

+0

您应该在您的问题中包含您期望的行为以及您实际获得的内容。对于询问问题的提示[ask} –

回答

1

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

1

我用下面的查询,它的工作。

VAL选项卡= sqlContext.sql( “选择SCREEN_NAME,通过SCREEN_NAME DESC LIMIT 1计数(文本)测试组的”

它的工作只用SCREEN_NAME但不要求使用user.screen_name。因为我有因此它不再需要'。'来访问json的嵌套属性。

+1

正确。因为您正在创建表格,所以您不必使用user.screen_name,但只是screen_name会起作用。 –