2016-04-23 14 views
1

Ich versuche, verschachtelte Attribute der JSON-Datei in einer Tabelle (Parkett) gespeichert zugreifen. Ich kann auf alle Datensätze der Tabelle zugreifen, indem Sie * aus test auswählen;Zugriff auf geschachtelte attributierte in spark sql

Aber ich bin nicht in der Lage verschachtelte Attribute zuzugreifen, indem Sie Abfrage als Schreiben: val tab = sqlContext.sql ("Text auswählen, user.screen_name von Test LIMIT 1")

Schema ist wie folgt:

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

Unten ist mein Code:

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} 

    } 

} 

HINWEIS: Select * from Test funktioniert gut, aber wenn ich versuche, user.screen_name (verschachteltes Attribut) wählen ich bin gett Der Fehler "Kann user.screen-Name nicht auflösen"

+0

Sie sollten wahrscheinlich in Ihrer Frage, welches Verhalten Sie erwarten und was Sie tatsächlich bekommen für Hinweise auf das Stellen von Fragen [ask} –

Antwort

1

Gemäß Ihrem Schema sollten Sie text.user.screen_name auswählen.

1

Ich habe unter Abfrage verwendet und es hat funktioniert.

val tab = sqlContext.sql ("screen_name wählen, count (Text) aus Testgruppe von screen_name DESC LIMIT 1"

Es funktionierte nur mit SCREEN_NAME aber nicht verlangen user.screen_name zu verwenden. Da ich flachgedrückte JSON-Daten in einer Parkett-Tabelle, daher erfordert es nicht mehr "." Zugriff auf geschachtelte Attribute von JSON.

+1

Richtig, da Sie Tabelle erstellen, müssen Sie nicht user.screen_name verwenden, aber nur screen_name würde funktionieren. –

Verwandte Themen