Кодировать ujson.Value в наборе данных Spark - PullRequest
0 голосов
/ 10 декабря 2018

Допустим, у меня хранятся эти строки JSON в текстовом файле.

{"a": "...", "data": [{}]}
{"a": "...", "data": [{"b": "..."}]}
{"a": "...", "data": [{"d": "..."}]}
{"a": "...", "data": [{"b": "...", "c": "..."}]}

Я хотел бы обработать файл в Spark Dataset, но я не знаю точную схемуполе data.Я использовал upickle для преобразования JSON в класс дел

case class MyCC(a: String, data: Seq[ujson.Value.Obj])

implicit val r: Reader[MyCC] = macroR

sc.textFile("s3://path/to/file.txt")
  .map(uread[MyCC](_))
  .toDS                 // Dataset[MyCC]
  .show()

При попытке получить следующее сообщение об ошибке:

java.lang.UnsupportedOperationException: No Encoder found for ujson.Value
- map value class: "ujson.Value"
- field (class: "scala.collection.mutable.LinkedHashMap", name: 
"value")
- array element class: "ujson.Obj"
- field (class: "scala.collection.Seq", name: "data")
- root class: "com.mycaule.MyCC"

Как мне решить эту проблему моделирования данных?

Спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Я мог читать данные без создания пользовательских кодировщиков, как требуется.Я только что определил класс дела правильно.

import scala.collection.mutable
case class CustomClass( a: String,
                        data: List[mutable.HashMap[String,String]]
                              )

val dataSourceName =  "s3/path/to/data.json"

val schema = ScalaReflection.schemaFor[CustomClass].dataType.asInstanceOf[StructType]

val data = spark.read.schema(schema).json(dataSourceName).as[CustomClass]

data.show(10, truncate = false)

Ниже приводится вывод:

+---+----------------------+
|a  |data                  |
+---+----------------------+
|...|[[]]                  |
|...|[[b -> ...]]          |
|...|[[d -> ...]]          |
|...|[[b -> ..., c -> ...]]|
+---+----------------------+
...