Как получить доступ к вложенным атрибутам в Spark sql

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

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


person kjosh    schedule 23.04.2016    source источник
comment
Вероятно, вам следует указать в своем вопросе, какого поведения вы ожидаете и что на самом деле получаете. Здесь вы найдете указатели, как задавать вопросы [спросить}   -  person David Wilson    schedule 23.04.2016


Ответы (2)


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

person Daniel Zolnai    schedule 23.04.2016

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

val tab = sqlContext.sql ("выберите screen_name, count (text) из тестовой группы по screen_name DESC LIMIT 1"

Он работал с использованием только screen_name, но не требовал использования user.screen_name. Поскольку я сгладил данные json в паркетной таблице, он больше не требует '.' для доступа к вложенным атрибутам json.

person kjosh    schedule 23.04.2016
comment
Правильный. поскольку вы создаете таблицу, вам не нужно использовать user.screen_name, просто screen_name будет работать. - person JAY G; 24.04.2016