繁体   English   中英

使用 Apache Spark 读取 JSON - `corrupt_record`

[英]Reading JSON with Apache Spark - `corrupt_record`

我有一个json文件, nodes如下所示:

[{"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1}
,{"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2}
,{"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3}
,{"toid":"osgb4000000031043208","point":[508513,196023],"index":4}]

我能够使用 Python 读取和操作此记录。

我正在尝试通过spark-shellscala读取此文件。

从本教程中,我可以看到可以通过sqlContext.read.json读取json

val vfile = sqlContext.read.json("path/to/file/nodes.json")

但是,这会导致corrupt_record错误:

vfile: org.apache.spark.sql.DataFrame = [_corrupt_record: string]

任何人都可以对这个错误有所了解吗? 我可以读取该文件并将其与其他应用程序一起使用,并且我确信它没有损坏和健全的json

Spark 无法将 JSON 数组读取到顶级记录,因此您必须通过:

{"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1} 
{"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2} 
{"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3} 
{"toid":"osgb4000000031043208","point":[508513,196023],"index":4}

正如您所指的教程所述

让我们从加载一个 JSON 文件开始,其中每一行都是一个 JSON 对象

道理很简单。 Spark 期望您传递一个包含大量 JSON 实体(每行一个实体)的文件,因此它可以分发它们的处理(每个实体,粗略地说)。

为了更清楚地了解它,这是官方文档的引用

请注意,作为 json 文件提供的文件不是典型的 JSON 文件。 每行必须包含一个单独的、自包含的有效 JSON 对象。 因此,常规的多行 JSON 文件通常会失败。

这种格式称为JSONL 基本上它是CSV的替代品。

由于 Spark 期望“JSON 行格式”不是典型的 JSON 格式,因此我们可以通过指定来告诉 Spark 读取典型的 JSON:

val df = spark.read.option("multiline", "true").json("<file>")

要将多行 JSON 作为 DataFrame 读取:

val spark = SparkSession.builder().getOrCreate()

val df = spark.read.json(spark.sparkContext.wholeTextFiles("file.json").values)

不推荐以这种方式读取大文件,来自WholeTextFiles 文档

小文件是首选,大文件也是允许的,但可能会导致性能不佳。

我遇到了同样的问题。 我在相同的配置中使用了 sparkContext 和 sparkSql:

val conf = new SparkConf()
  .setMaster("local[1]")
  .setAppName("Simple Application")


val sc = new SparkContext(conf)

val spark = SparkSession
  .builder()
  .config(conf)
  .getOrCreate()

然后,使用 spark 上下文我读取了整个 json(JSON - 文件路径)文件:

 val jsonRDD = sc.wholeTextFiles(JSON).map(x => x._2)

您可以为将来的选择、过滤器创建架构...

val schema = StructType( List(
  StructField("toid", StringType, nullable = true),
  StructField("point", ArrayType(DoubleType), nullable = true),
  StructField("index", DoubleType, nullable = true)
))

使用 spark sql 创建一个 DataFrame:

var df: DataFrame = spark.read.schema(schema).json(jsonRDD).toDF()

测试使用 show 和 printSchema:

df.show()
df.printSchema()

sbt 构建文件:

name := "spark-single"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"
libraryDependencies +="org.apache.spark" %% "spark-sql" % "2.0.2"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM