在Apache 3.0火花from_json返回null

火花3.0及以上不能解析JSON數組結構;from_json返回null。

寫的shanmugavel.chandrakasu

去年發表在:2022年5月23日

問題

from_json函數是用來解析JSON字符串並返回一個值的結構。

例如,如果您有JSON字符串[{" id ": " 001 ", "名稱":“彼得”}],你可以通過它來from_json與模式,解析結構值作為回報。

%從pyspark.sql python。功能導入坳,from_json顯示(df.select(坳(“價值”),from_json(坳(“價值”),json_df_schema,{“模式”:“寬容”})))

在這個例子中,dataframe包含一個列“價值”,與內容[{" id ": " 001 ", "名稱":“彼得”}]和模式StructType(列表(StructField (id、StringType真實),StructField(名稱、StringType真實)))

這工作正常火花2.4及以下(磚運行時6.4 ES下麵)。

* id:“001”*的名字:“彼得”

這將返回null值在火花3.0及以上(磚運行時的7.3 LTS及以上)。

零* * id:名字:零

導致

這是因為火花3.0及以上不能解析JSON數組結構。

您可以通過運行確認這一點from_jsonFAILFAST模式。

%從pyspark.sql python。功能導入坳,from_json顯示(df.select(坳(“價值”),from_json(坳(“價值”),json_df_schema,{“模式”:“FAILFAST”})))

這將返回一個錯誤消息,它定義了問題的根源。

引起的:RuntimeException:解析JSON數組作為結構是被禁止的

解決方案

你必須通過模式ArrayType而不是StructType在磚運行時7.3 LTS及以上。

%從pyspark.sql python。類型進口StringType、ArrayType StructType, StructField schema_spark_3 = ArrayType (StructType ([StructField (“id”, StringType(),真的),StructField(“名字”,StringType(),真的))))從pyspark.sql。功能導入坳,from_json顯示(df.select(坳(“價值”),from_json(坳(“價值”),schema_spark_3,{“模式”:“寬容”})))

在這個例子代碼,前麵的StructType模式是包含在ArrayType並使用新模式from_json

這個解析JSON字符串正確執行,並返回預期的值。