2016-04-23 4 views
1

Я пытаюсь получить доступ к вложенным атрибутам json-файла, хранящимся в таблице (паркет). Я могу получить доступ ко всем записям таблицы на выбрать * из теста;Как получить доступ к вложенным атрибутам в spark sql

Однако, я не в состоянии получить доступ вложенных атрибутов, написав запрос как: вкладки валь = sqlContext.sql («выберите текст, user.screen_name из тестового 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 (вложенный атрибут) Я являюсь GETT ошибка «Не удается разрешить имя пользователя.screen_name»

+0

Возможно, вы должны включить в свой вопрос, какое поведение вы ожидаете и что вы на самом деле получаете. для указателей на задание вопросов [ask} –

ответ

1

В соответствии с вашей схемой вы должны выбрать text.user.screen_name.

1

Я использовал ниже запрос, и он сработал.

вкладка Вэл = sqlContext.sql («выберите screen_name, граф (текст) из тестовой группы по screen_name DESC LIMIT 1»

Он работал с использованием только screen_name, но не требует, чтобы использовать user.screen_name. Так как у меня сплющенные данные json в паркетном столе, следовательно, это больше не требует «.» для доступа к вложенным атрибутам json.

+1

Правильно, поскольку вы создаете таблицу, вам не нужно использовать user.screen_name, но будет работать только имя screen_name. –

Смежные вопросы