![](/img/trans.png)
[英]_corrupt_record error when reading a JSON file into Spark
[英]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-shell
在scala
讀取此文件。
從本教程中,我可以看到可以通過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.