问题
的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字符串正确执行,并返回预期的值。