【问题标题】:How to write each dataframe partition into different tables如何将每个数据帧分区写入不同的表
【发布时间】:2019-07-03 22:16:01
【问题描述】:

我正在使用 Databricks 连接到 EventHub,其中来自 EventHub 的每条消息都可能非常不同。

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

我正在寻找性能,所以我避免收集数据或进行不必要的处理,我也想通过分区并行保存。但是我不确定如何以正确的方式做到这一点。

我想将每个 ID 的正文分批附加到不同的 AND SPECIFIC 表中,ID 将为我提供我需要保存在正确表中的信息。所以为了做到这一点,我一直在尝试两种方法:

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

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

方法 2 迫使我从 pandas_udf 输出,这是一个与输入模式相同的数据帧,这不会发生,因为我将 eventthub 消息从 CSV 转换为数据帧以便将其保存到表中。我可以返回我收到的相同数据帧,但这听起来很奇怪。

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

【问题讨论】:

    标签: python-3.x pyspark azure-databricks


    【解决方案1】:

    如果您的 Id 具有不同数量的值(类型/国家列的种类),您可以使用 partitionBy 进行存储,从而将它们保存到不同的表中会更快。 否则,通过使用与跨表划分数据时要使用的逻辑相同的逻辑,从您的 id 列创建派生列(使用 withColumn)。然后,您可以将该派生列用作分区列,以加快加载速度。

    【讨论】:

    • 如果我理解正确的话,使用 partitionBy 保存到文件然后读取文件并保存到表中会更快吗?是因为polybase吗?
    • 我现在的想法是将所有消息(无论 ID)添加到通用增量表中,然后我可以在 foreach 循环中单独选择每个 id。我相信这不会创建一堆文件,我会确保每个 ID 都被单独处理并且我将能够并行运行
    • 在将其放入增量表时,如果您希望再次从那里获取并将其写入单个表,则可以通过 ID 进行分区。这会即兴发挥你的表现。
    • 这正是我决定做的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多