从结构流 json 数据创建分区列

create partition column from structure streaming json data

我是结构化流媒体的新手,想根据 json 消息的日期列创建分区列。

这是示例消息:

{"date": "2022-03-01", "code": "1000310014", "no": "20191362283860", "update_type_cd": "UP", "EventProcessedUtcTime": null, "PartitionId": null, "EventEnqueuedUtcTime": null}

{"date": "2022-03-01", "code": "2000310014", "no": "300191362283860", "update_type_cd": "UP", "EventProcessedUtcTime": null, "PartitionId": null, "EventEnqueuedUtcTime": null}

{"date": "2022-03-01", "code": "30002220014", "no": "20191333383860", "update_type_cd": "UP", "EventProcessedUtcTime": null, "PartitionId": null, "EventEnqueuedUtcTime": null}

val date = event.select(col("date"))

val stream = flatten_messages
      .writeStream
      .partitionBy(date)
      .format("delta")
      .outputMode("append")
      .start(output_path)

json 消息的分区方式是否正确?

不,在 partitionBy 中您只需指定列名,而不是数据框。所以代码只是:

val stream = flatten_messages
      .writeStream
      .partitionBy("date")
      .format("delta")
      .outputMode("append")
      .start(output_path)

但第一个问题是 - 您真的需要对数据进行分区吗?具有数据跳过、ZOrder 等功能的 Delta 可能没有严格要求。

P.S。此外,您可能需要将 date 列转换为 date 类型 - 在这种情况下,它将更有效地存储在磁盘上,并允许范围搜索等。尽管它与分区无关。