問題
的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_json在FAILFAST模式。
%從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字符串正確執行,並返回預期的值。