结构化流媒体是 python + spark 3.1.1 + kafka 的唯一选择吗?
Is structured streaming the only option for python + spark 3.1.1 + kafka?
doc for streaming 集成不包含 python 部分。这是否意味着 python 不受支持?
另一方面,在 structured streaming 中,Kafka 将所有内容都放入一个或两个列(键和值)中,并且 sql 操作在这里开箱即用。引入纯 Python 处理的唯一方法是 UDF,这很昂贵。这是真的吗?
许多人在 Kafka 中使用结构化流,没有遇到任何问题。 Spark 将所有内容都放入两列中,这是因为它是 Kafka 的工作方式(以及其他系统,如 EventHubs、Kinesis 等)——从 Kafka 的角度来看,键和值都只是二进制 blob,而 Kafka对里面的内容一无所知 - 由开发人员决定将什么放入该 blob - 纯字符串、Avro、JSON 等
Kafka & Structured Streaming 的典型工作流程如下所示(一切都是通过 Spark API 完成的,无需使用 UDF,并且非常高效):
- 用
spark.readStream
读取数据
- 将
value
(也许 key
)转换为特定类型,例如,如果使用 JSON,则为 string
,如果使用 Avro,则保留为二进制
- 取决于格式:
- 如果使用JSON,使用from_json function将字符串解码为Struct
- 如果使用 Avro,则使用 from_avro function
- 将有效载荷中的字段提升到数据帧的顶层
例如,对于 JSON 作为值:
json_schema = ... # put structure of your JSON payload here
df = spark.read\
.format("kafka")\
.options(**kafka_options)\
.load()\
.withColumn("value", F.col("value").cast("string"))\
.withColumn("json", F.from_json(F.col("value"), json_schema)\
.select("json.*", "*")
doc for streaming 集成不包含 python 部分。这是否意味着 python 不受支持?
另一方面,在 structured streaming 中,Kafka 将所有内容都放入一个或两个列(键和值)中,并且 sql 操作在这里开箱即用。引入纯 Python 处理的唯一方法是 UDF,这很昂贵。这是真的吗?
许多人在 Kafka 中使用结构化流,没有遇到任何问题。 Spark 将所有内容都放入两列中,这是因为它是 Kafka 的工作方式(以及其他系统,如 EventHubs、Kinesis 等)——从 Kafka 的角度来看,键和值都只是二进制 blob,而 Kafka对里面的内容一无所知 - 由开发人员决定将什么放入该 blob - 纯字符串、Avro、JSON 等
Kafka & Structured Streaming 的典型工作流程如下所示(一切都是通过 Spark API 完成的,无需使用 UDF,并且非常高效):
- 用
spark.readStream
读取数据 - 将
value
(也许key
)转换为特定类型,例如,如果使用 JSON,则为string
,如果使用 Avro,则保留为二进制 - 取决于格式:
- 如果使用JSON,使用from_json function将字符串解码为Struct
- 如果使用 Avro,则使用 from_avro function
- 将有效载荷中的字段提升到数据帧的顶层
例如,对于 JSON 作为值:
json_schema = ... # put structure of your JSON payload here
df = spark.read\
.format("kafka")\
.options(**kafka_options)\
.load()\
.withColumn("value", F.col("value").cast("string"))\
.withColumn("json", F.from_json(F.col("value"), json_schema)\
.select("json.*", "*")