簡體   English   中英

使用 JSON 架構 (PySpark) 時,Databricks 中的 _corrupt_record 列產生 NULL 值

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

任何幫助將非常感激!

嘗試的解決方案:

  1. 從零開始的 JSON 架構 -如上所述,它產生 NULL 值。

  2. multiLine=True 和 allowSingleQuotes=True 讀取選項 -在另一個 StackOverflow 帖子中找到此內容,但在使用我從頭開始的 JSON 架構時,它仍然產生 NULL 值。

  3. 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 字符串組成,沒有解析出任何嵌套對象。

  4. 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.

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