簡體   English   中英

如果在通過 spark 讀取 json 時需要進行架構驗證,則需要在架構中明確添加“_corrupt_record”列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM