首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spark数据集中编码ujson.Value

在Spark数据集中编码ujson.Value
EN

Stack Overflow用户
提问于 2018-12-10 21:17:12
回答 1查看 302关注 0票数 0

假设我将这些JSON行存储在一个文本文件中。

代码语言:javascript
复制
{"a": "...", "data": [{}]}
{"a": "...", "data": [{"b": "..."}]}
{"a": "...", "data": [{"d": "..."}]}
{"a": "...", "data": [{"b": "...", "c": "..."}]}

我希望将该文件处理为Spark Dataset,但我不知道字段data的确切模式。我使用upickle将JSON转换为case类。

代码语言:javascript
复制
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()

尝试这样做,我得到了以下错误:

代码语言:javascript
复制
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"

我如何解决这个数据建模问题?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-12-10 21:42:45

我可以根据需要读取数据,而不需要创建自定义编码器。我只是正确地定义了case类。

代码语言:javascript
复制
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)

以下是输出:

代码语言:javascript
复制
+---+----------------------+
|a  |data                  |
+---+----------------------+
|...|[[]]                  |
|...|[[b -> ...]]          |
|...|[[d -> ...]]          |
|...|[[b -> ..., c -> ...]]|
+---+----------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53706509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档