【发布时间】:2021-11-21 18:56:58
【问题描述】:
Spark 流式传输:
我收到一个包含两列的数据框。第一列是string 类型,包含一个json 字符串,第二列由schema 组成,每个value(第一列)。
Batch: 0
-------------------------------------------
+--------------------+--------------------+
| value| schema|
+--------------------+--------------------+
|{"event_time_abc...|`event_time_abc...|
+--------------------+--------------------+
该表存储在val input(非可变变量)中。我正在使用DataType.fromDDL 函数通过以下方式将string 类型转换为json DataFrame:
val out= input.select(from_json(col("value").cast("string"),ddl(col("schema"))))
ddl 是一个预定义函数,DataType.from_ddl(_:String):DataType 在 spark(scala) 中,但我已经注册了它,以便我可以在整个列上使用它,而不是仅在字符串上使用它。我是通过以下方式完成的:
val ddl:UserDefinedFunction = udf(DataType.fromDDL(_:String):DataType)
这是input 表的列、值和架构的最终转换。
val out = input.select(from_json(col("value").cast("string"),ddl(col("schema"))))
但是,我在这一行的注册中遇到了异常:
val ddl:UserDefinedFunction = udf(DataType.fromDDL(_:String):DataType)
错误是:
java.lang.UnsupportedOperationException: Schema for type org.apache.spark.sql.types.DataType is not supported
如果我使用:
val out = input.select(from_json(col("value").cast("string"),DataType.fromDDL("`" + "event_time_human2"+"`" +" STRING")).alias("value"))
然后它可以工作,但正如你所见,我只在函数DataType.fromDDL(_:String):DataType 中使用string(手动输入来自schema 列)。
那么如何在不注册的情况下将此功能应用于整个列,或者有没有其他方法可以注册该功能?
编辑:from_json 函数的第一个参数需要一个列,而第二个参数需要一个 schema 而不是一个列。因此,我想需要一种手动方法来解析每个 value 字段和每个 schema 字段。经过一番调查,我发现 DataFrames 不支持 DataType。
自从在这个问题上设置了赏金。我想提供有关数据和架构的其他信息。模式在 DDL(字符串类型)中定义,可以使用 from_DDL 函数解析。该值是简单的json 字符串,将使用我们使用from_DDL 函数派生的架构进行解析。
基本思想是每个值都有自己的模式,需要用相应的模式进行解析。应该在存储结果的位置创建一个新列。
数据: 这是数据的一个示例:
值 = {"event_time_human2":"09:45:00 +0200 09/27/2021"}
schema = "`event_time_human2` STRING"
不需要转换为正确的时间格式。只要一个字符串就可以了。
它位于streaming context。因此,并非所有方法都有效。
【问题讨论】:
-
col("schema")实际上只是一个命名的 Column 对象,而不是那个单元格的选定字符串内容 -
@OneCricketeer ddl 由我注册,它需要一个字符串,但注册后 spark 传递一个列而不是字符串。
-
“取一个字符串”,好吧,但是你给它一个类型未定义的列对象。
input的架构是什么? -
也许尝试定义一个接受两个参数的UDF,该参数接受两个列并在其上运行
from_json? -
@OneCricketeer 我试过当我传递两列时,from_json 函数的输出是一个再次未定义的列。所以我不能传回结果。
标签: scala apache-spark apache-spark-sql spark-structured-streaming