【问题标题】:Need to Convert Json to DataFrame in Scala需要在 Scala 中将 Json 转换为 DataFrame
【发布时间】:2019-06-26 12:38:23
【问题描述】:

这里是需要转换的JSON

{
  "name": "Jon",
    "tags":[
            {
                "1": "San Jose",
                "2": "California",
                "3": 1987
            },
            {   
                "1": "University Ave",
                "2": "Princeton",
                "3": 1990
            }
    ]
}

需要转换成DataFrame,像这个

Name  1               2            3
Jon   SanJose         California   1987
Jon   Univesity Ave   Princeton    1990

谁能帮我解开这个谜语。谢谢!!

【问题讨论】:

  • 您使用的是哪个 JSON 库?你都尝试了些什么?向我们展示一些不起作用的代码,以便我们了解您偏离轨道的地方。
  • 当你说 "dataframe" 是指来自 Sparkorg.apache.spark.sql.DataFrame 吗?如果是这样,1. 添加apache-spark 标签,2. Spark 支持开箱即用,只需阅读基本教程或在 google 中快速搜索即可为您提供答案 - 如果没有,请忽略此评论并专注于jwvh 的评论。
  • 我正在使用 json4s 库是正确的导入还是我必须使用杰克逊。 .... import org.json4s._ import org.json4s.native.JsonParser val rdd = sqlContext.read.json("file path").toDF ("Name","1","2","3") .... 读取 json 文件,但在我寻找时它没有得到输出。你我有没有使用一些模式来阅读它,然后把它放到 Dataframe 中?

标签: json scala apache-spark parsing dataframe


【解决方案1】:

正如我在 cmets 中所说,Spark supports JSON paring out of the box - 你不需要任何外部库。

Spark,会自动推断文件的架构,但不会自动展平数据...
您需要在您的程序中执行此操作。

这是一个简单示例,说明如何使用 typed Dataset
(注意:JSON 文件应每行包含一个文档,如文档)
(另外,请注意我将这些字段重命名为 abc,因此它们是有效的 Scala 标识符)。

import org.apache.spark.sql.{SparkSession, Encoder}

final case class Nested(name: String, tags: List[Tag])
final case class Tag(a: String, b: String, c: Int)
final case class Flattened(name: String, a: String, b: String, c: Int)

val spark = SparkSession.builder.master("local[*]").getOrCreate()
import spark.implicits._

val nestedEncoder: Encoder[Nested] = implicitly
val nestedSchema = nestedEncoder.schema

val nestedDS =
  spark
    .read
    .option(key = "charset", value = "UTF-8")
    .schema(nestedSchema)
    .json(path = "path")
    .as[Nested](nestedEncoder)

val flattenedDS = for {
  nested <- nestedDS
  tag <- nested.tags
} yield Flattened(nested.name, tag.a, tag.b, tag.c)
// flattenedDS: Dataset[Flattened] = [name: string, a: string, b: string, c: integer]

flattenedDS.printSchema()
// root
//  |-- name: string (nullable = true)
//  |-- a: string (nullable = true)
//  |-- b: string (nullable = true)
//  |-- c: integer (nullable = false)

flattenedDS.show()
// +----+--------------+----------+----+
// |name|             a|         b|   c|
// +----+--------------+----------+----+
// | Jon|      San Jose|California|1987|
// | Jon|University Ave| Princeton|1990|
// +----+--------------+----------+----+

【讨论】:

  • 不需要全部在 1 行。
  • @thebluephantom 你能详细说明一下吗?我不太明白。 - 如果你的意思是Encoder,我确实需要它在val nestedEncoder: Encoder[Nested] = implicitly 行中。
  • 不确定我是否关注。
  • @thebluephantom 对不起,我也没有。让我们重新开始 - 你说“不需要全部在 1 行”,我不明白你的意思,你能解释一下吗?
  • 如果我有 spark 1.6 怎么办,如何使用 sqlContext.read 代替 spark.read ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 2022-12-18
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2022-01-12
相关资源
最近更新 更多