![](/img/trans.png)
[英]_corrupt_record error when reading a JSON file into Spark
[英]need to add "_corrupt_record" column explicitly in the schema if you need to do schema validation when reading json via spark
當我通過 spark(使用 scala)讀取 JSON 時
val rdd = spark.sqlContext.read.json("/Users/sanyam/Downloads/data/input.json")
val df = rdd.toDF()
df.show()
println(df.schema)
//val schema = df.schema.add("_corrupt_record",org.apache.spark.sql.types.StringType,true)
//val rdd1 = spark.sqlContext.read.schema(schema).json("/Users/sanyam/Downloads/data/input_1.json")
//rdd1.toDF().show()
這導致以下 DF:
+--------+----------------+----------+----------+----------+--------------------+----+--------------------+-------+---+---------+--------------+--------------------+--------------------+------------+----------+--------------------+
| appId| appTimestamp|appVersion| bankCode|bankLocale| data|date| environment| event| id| logTime| logType| msid| muid| owner|recordType| uuid|
+--------+----------------+----------+----------+----------+--------------------+----+--------------------+-------+---+---------+--------------+--------------------+--------------------+------------+----------+--------------------+
|services| 1 446026400000 | 2.10.4|loadtest81| en|Properties : {[{"...|user|af593c4b000c29605c90|Payment| 1|152664593|AppActivityLog|90022384526564ffc...|22488dcc8b29-235c...|productOwner|event-logs|781ce0aaaaa82313e8c9|
|services| 1 446026400000 | 2.10.4|loadtest81| en|Properties : {[{"...|user|af593c4b000c29605c90|Payment| 1|152664593|AppActivityLog|90022384526564ffc...|22488dcc8b29-235c...|productOwner|event-logs|781ce0aaaaa82313e8c9|
+--------+----------------+----------+----------+----------+--------------------+----+--------------------+-------+---+---------+--------------+--------------------+--------------------+------------+----------+--------------------+
StructType(StructField(appId,StringType,true), StructField(appTimestamp,StringType,true), StructField(appVersion,StringType,true), StructField(bankCode,StringType,true), StructField(bankLocale,StringType,true), StructField(data,StringType,true), StructField(date,StringType,true), StructField(environment,StringType,true), StructField(event,StringType,true), StructField(id,LongType,true), StructField(logTime,LongType,true), StructField(logType,StringType,true), StructField(msid,StringType,true), StructField(muid,StringType,true), StructField(owner,StringType,true), StructField(recordType,StringType,true), StructField(uuid,StringType,true))
如果我想對我閱讀的任何進一步的 json 應用驗證,那么我將模式作為變量並將.schema
作為參數進行解析[請參閱注釋的代碼行] ,但即使是損壞的記錄也不會進入_corrupt_record
列(這應該默認發生),而是將所有列中的壞記錄解析為空,這會導致數據丟失,因為沒有記錄。 盡管當您在模式中明確添加_corrupt_record
列時,一切正常,並且corruption_record 進入相應的列,但我想知道為什么會這樣? (另外,如果你給出一個格式錯誤的 Json,spark 會通過創建一個_corrupt_record
列來自動處理它,那么模式驗證為什么需要更早的顯式列添加)??
讀取損壞的 json 數據將架構返回為[_corrupt_record: string]
。 但是您正在使用錯誤的schema
讀取損壞的數據,因此您將整行作為空值。 但是,當您顯式添加_corrupt_record
您會在該列中獲得整個 json 記錄,並且我假設在所有其他列中都為 null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.