首页 > 解决方案 > PySpark Schema 应以 DDL 格式指定为字符串文字或 schema_of_json 函数的输出,而不是 schemaofjson(`col1`);

问题描述

我正在尝试使用 schema_of_json 函数从类似 json 的字符串中推断出架构,然后使用该架构将该字符串值格式化为使用 from_json 函数的结构。我的代码是

import pyspark.sql.functions as sqlf
dfTemp = readFromEventHubs()
df= dfTemp.withColumn("col1", sqlf.get_json_object(col("jsonString"), '$.*'))
col1Val= df.col1
jsonSchema = sqlf.schema_of_json(col1Val)
df.select(sqlf.from_json(df.col1, jsonSchema).alias("jsonCol")) 

但我有以下例外

AnalysisException: 'Schema should be specified in DDL format as a string literal or output of the schema_of_json function instead of schemaofjson(`col1Val`);'

只是一个精度,我正在使用火花流。

我的代码有什么问题,谢谢

标签: pysparkapache-spark-sql

解决方案


schema_of_json需要一个表示有效 JSON 对象的字符串。您正在传递它 a pyspark.sql.Column,可能是因为您希望它会推断出每一行的模式。不过那不会发生。

from_json期望 Column 作为其第一个位置参数,该参数包含 JSON 字符串,并作为其第二个参数pyspark.sql.types.StructType,或者pyspark.sql.types.ArrayType甚至(从 2.3 开始)一个 DDL 格式的字符串或一个 JSON 格式的字符串(这是一个规范)。

这意味着您不能每行推断出不同的模式。

如果您在阅读之前知道架构(很有可能您确实知道),那么在您调用from_json. 如果您没有固定在 Databricks Delta 上,则可以使用不同的 DataFrameReader: spark.read.json,不指定其关键字参数schema,以便推断架构。


推荐阅读