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

这篇文章有用吗?