Чтение внешнего файла JSON в RDD и извлечение определенных значений в Scala - PullRequest
2 голосов
/ 21 сентября 2019

Во-первых, я совершенно новичок в scala и spark, хотя немного famailiar с pyspark.Я работаю с внешним файлом JSON, который довольно большой, и мне не разрешено преобразовывать его в набор данных или фрейм данных.Я должен выполнить операции на чистом RDD.

Итак, я хотел знать, как я могу получить конкретное значение ключа.Поэтому я читаю свой файл json как sc.textFile("information.json") Теперь обычно в python я хотел бы сделать так:

x = sc.textFile("information.json").map(lambda x: json.loads(x))\ 
 .map(lambda x: (x['name'],x['roll_no'])).collect()

есть ли какой-либо эквивалент вышеуказанного кода в scala (извлечение значения определенных ключей) в RDD без преобразования в dataframe илинабор данных.

По сути тот же вопрос, что и Эквивалентная функция json.loads pyspark для spark-shell , но в надежде получить более конкретный и дружественный для новичков ответ.Спасибо

Данные Json: {"name":"ABC", "roll_no":"12", "Major":"CS"}

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Вот один из способов использования библиотеки json4s .Библиотека уже используется внутри Spark.

import org.json4s._
import org.json4s.jackson.JsonMethods._

// {"name":"ABC1", "roll_no":"12", "Major":"CS1"}
// {"name":"ABC2", "roll_no":"13", "Major":"CS2"}
// {"name":"ABC3", "roll_no":"14", "Major":"CS3"}
val file_location = "information.json"

val rdd = sc.textFile(file_location)

rdd.map{ row =>
  val json_row = parse(row)

  (compact(json_row \ "name"), compact(json_row \ "roll_no"))
}.collect().foreach{println _}

// Output
// ("ABC1","12")
// ("ABC2","13")
// ("ABC3","14")

Сначала мы анализируем данные строки в json_row, затем получаем доступ к свойствам строки с помощью оператора \, то есть: json_row \ "name".Конечный результат - последовательность кортежей name,roll_no

0 голосов
/ 21 сентября 2019

Я использовал для анализа json в Scala с помощью такого метода:

 /** ---------------------------------------
    * Example of method to parse simple json
        {
        "fields": [
          {
            "field1": "value",
            "field2": "value",
            "field3": "value"
          }
        ]
      }*/

import scala.io.Source
import scala.util.parsing.json._

  case class outputData(field1 : String, field2: String, field3 : String)

  def singleMapJsonParser(JsonDataFile : String) : List[outputData] = {

    val JsonData : String = Source.fromFile(JsonDataFile).getLines.mkString

    val jsonFormatData = JSON.parseFull(JsonData).map{
      case json : Map[String, List[Map[String,String]]] =>
        json("fields").map(v => outputData(v("field1"),v("field2"),v("field3")))
    }.get

    jsonFormatData
  }

Тогда вам просто нужно вызвать ваш sparkContext, чтобы преобразовать вывод списка List [Class] в RDD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...