2016-04-23 85 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會起作用。 –