如何将每个数据帧分区写入不同的表

How to write each dataframe partition into different tables

我正在使用 Databricks 连接到 Eventhub,其中来自 EventHub 的每条消息可能与另一条有很大不同。

在消息中,我有一个正文和一个id。

我追求的是性能,所以我避免收集数据或做不必要的处理,我也想通过分区并行保存。但是我不确定如何以正确的方式执行此操作。

我想在不同的AND SPECIFIC table中批量附加每个ID的正文,ID会给我我需要保存的信息对table。所以为了做到这一点,我一直在尝试两种方法:

  1. 分区:重新分区(numPartitions,ID)-> ForeachPartition
  2. 分组:groupBy('ID').apply(myFunction) #@pandas_udf GROUPED_MAP

方法1看起来不太吸引我,重新分区过程看起来很不必要而且我在文档中看到即使我将列设置为分区,它也可能会将该列的许多id保存在一个单个分区。它只保证与该id相关的所有数据都在分区中而不是拆分

方法 2 迫使我从 pandas_udf 输出一个具有相同输入模式的数据帧,这不会发生,因为我正在将 eventhub 消息从 CSV 转换为数据帧以便将其保存到 table。我可以 return 我收到的相同数据帧,但这听起来很奇怪。

有什么我没有看到的好方法吗?

如果您的 ID 具有不同数量的值(类似于 type/country 列),您可以使用 partitionBy 进行存储,从而将它们保存到不同的 table 会更快。 否则,使用与在 table 之间分配数据时使用的逻辑相同的逻辑,从您的 id 列创建一个派生列(使用 withColumn)。然后您可以将该派生列用作分区列,以便更快地加载。