Apache spark 无法将json记录的模式动态传递给spark结构化流式记录
我有一个Spark Kakfa结构流媒体管道。听一个主题,它可能有不同模式的json记录。 现在我想基于键(x_y)解析模式,然后应用到值部分来解析json记录。 所以这里键的“y”部分说明了模式类型。 我试图从udf中获取模式字符串,然后将其传递给from_json()函数。 但它例外地失败了Apache spark 无法将json记录的模式动态传递给spark结构化流式记录,apache-spark,apache-kafka,Apache Spark,Apache Kafka,我有一个Spark Kakfa结构流媒体管道。听一个主题,它可能有不同模式的json记录。 现在我想基于键(x_y)解析模式,然后应用到值部分来解析json记录。 所以这里键的“y”部分说明了模式类型。 我试图从udf中获取模式字符串,然后将其传递给from_json()函数。 但它例外地失败了 org.apache.spark.sql.AnalysisException: Schema should be specified in DDL format as a string literal
org.apache.spark.sql.AnalysisException: Schema should be specified in DDL format as a string literal or output of the schema_of_json function instead of `schema`
使用的代码:
df.withColumn("data_type", element_at(split(col("key").cast("string"),"_"),1))
.withColumn("schema", schemaUdf($"data_type"))
.select(from_json(col("value").cast("string"), col("schema")).as("data"))
模式演示:
{
"type" : "struct",
"fields" : [ {
"name" : "name",
"type" : {
"type" : "struct",
"fields" : [ {
"name" : "firstname",
"type" : "string",
"nullable" : true,
"metadata" : { }
}]
},
"nullable" : true,
"metadata" : { }
} ]
}
使用的自定义项:
lazy val fetchSchema = (fileName : String) => {
DataType.fromJson(mapper.readTree(new File(fileName)).toString)
}
val schemaUdf = udf[DataType, String](fetchSchema)
注意:我没有使用confluent功能。你能分享你的
“schema”
列的内容(示例)吗?@Amit,从错误消息本身可以清楚地看出,你不能使用列(“schema”)
。相反,您可以使用json的模式(col(“schema”),如错误消息所示。顺便说一句,我希望你使用的是Spark 3。0@mazaneicha,不幸的是,架构很大,因此我无法共享它。它是嵌套的JSON记录,所以请考虑按.@ SaTiYANS模式,我使用2.4.5。我不确定这是否会产生影响。我已经尝试过json的模式(col(“schema”)),但没有成功。它看起来像是在底层,它只解析,字符串文字,udf是不受欢迎的。对不起,版本在这里没有区别!顺便问一下,你能分享一下你在schemaUDF
中所做的事情吗?schema
变量的类型是什么?另外,当您传递json的schema\u
时,您会得到什么?您能否共享的“schema”
列的内容(示例)?@Amit,从错误消息本身可以清楚地看出,您不能使用列(“schema”)
。相反,您可以使用json的模式(col(“schema”),如错误消息所示。顺便说一句,我希望你使用的是Spark 3。0@mazaneicha,不幸的是,架构很大,因此我无法共享它。它是嵌套的JSON记录,所以请考虑按.@ SaTiYANS模式,我使用2.4.5。我不确定这是否会产生影响。我已经尝试过json的模式(col(“schema”)),但没有成功。它看起来像是在底层,它只解析,字符串文字,udf是不受欢迎的。对不起,版本在这里没有区别!顺便问一下,你能分享一下你在schemaUDF
中所做的事情吗?schema
变量的类型是什么?另外,当您传递json的模式时,您会得到什么?