![](/img/trans.png)
[英]need to add "_corrupt_record" column explicitly in the schema if you need to do schema validation when reading json via spark
[英]_corrupt_record Column in Databricks Yields NULL Values When Using JSON Schema (PySpark)
我正在使用 PySpark 在 Databricks 中使用 REST API。 API 響應返回一個列表,其中列表的每個元素都是 JSON 字符串。 當我並行化 JSON 時,它會產生一個_corrupt_record列,其中該列的每個值都是 JSON 字符串:
### API Call
response = requests.get(api_url, headers=api_call_header)
api_json = response.json()
df = spark.read.json(sc.parallelize(api_json))
display(df)
這是當我將單個值的 JSON 字符串復制到 JSON 驗證器時的樣子:
{
'Var1': 'String',
'Var2': {
'Var3': 'String',
'Var4': None,
'Var5': 'String',
'Var6': 'String',
'Var7': 'String',
'Var8': 'String'
},
'Var9': None,
'Var10': 'String'
}
無論出於何種原因,我都無法訪問 Var2 的嵌套 Struct 對象。 當我使用from_json function 和以下從頭開始的模式時,它會從 Var2 開始產生 NULL 值:
schema = StructType([
StructField('Var1', StringType()),
StructField('Var2',
StructType([
StructField('Var3', StringType()),
StructField('Var4', NullType()),
StructField('Var5', StringType()),
StructField('Var6', StringType()),
StructField('Var7', StringType()),
StructField('Var8', StringType())
])
),
StructField('Var9', NullType()),
StructField('Var10', StringType())
])
這是我試圖解析 JSON 字符串的代碼: df = df.withColumn('struct_json', from_json(col('_corrupt_record'), schema))
這會解析第一個鍵:值對,但將列值的 rest 生成為 NULL:
*object:*
Var1: "String"
Var2: NULL
Var3: NULL
Var4: NULL
Var5: NULL
Var6: NULL
Var7: NULL
Var8: NULL
Var9: NULL
Var10: NULL
任何幫助將非常感激!
嘗試的解決方案:
從零開始的 JSON 架構 -如上所述,它產生 NULL 值。
multiLine=True 和 allowSingleQuotes=True 讀取選項 -在另一個 StackOverflow 帖子中找到此內容,但在使用我從頭開始的 JSON 架構時,它仍然產生 NULL 值。
JSON Schema Using rdd.map Method - I tried to derive a schema using json_schema = spark.read.json(df.rdd.map(lambda row: row._corrupt_record)).schema
but that simply created a one-layer Struct object where該層由整個 JSON 字符串組成,沒有解析出任何嵌套對象。
SQL 解析鍵:值對 -嵌套對象太多,arrays 無法成功解析並產生太差的性能。
這個問題的答案非常簡單:
從 API 調用中, api_json = response.json()
創建一個 Python 字典。 這被確認為type(api_json)
。
使用spark.read.json
方法創建 DataFrame 是不正確的,因為源api_json
數據是字典而不是 JSON。
所以修復改變了這一點:
response = requests.get(api_url, headers=api_call_header)
api_json = response.json()
df = spark.read.json(sc.parallelize(api_json))
display(df)
對此:
response = requests.get(api_url, headers=api_call_header)
api_json = response.json()
df = spark.createDataFrame(api_json, schema=schema)
display(df)
對於架構,我使用了我在 PySpark 中從頭開始構建的架構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.