Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 无法将json记录的模式动态传递给spark结构化流式记录_Apache Spark_Apache Kafka - Fatal编程技术网

Apache spark 无法将json记录的模式动态传递给spark结构化流式记录

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

我有一个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 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的模式时,您会得到什么?