簡體   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