将宽表(40000+列)写入Databricks配置单元Metastore以与AutoML一起使用



我想使用GUI使用Azure Databricks AutoML训练回归预测模型。训练数据非常广泛。除了响应变量之外的所有列都将用作功能。

要使用Databricks AutoML GUI,我必须将数据作为表存储在Hive元存储中。我有一个大型DataFramedf,它有40000多列。

print((df.count(), len(df.columns)))
(33030, 45502)

使用以下PySpark命令将这些数据写入Hive中的一个表(我认为这是标准的(:

df.write.mode('overwrite').saveAsTable("WIDE_TABLE")

遗憾的是,此作业未在"可接受"时间(10小时(内完成。我取消了,因此没有错误消息。

当我用减少列数时

df.select(df.columns[:500]).write.mode('overwrite').saveAsTable("WIDE_TABLE")

它的效果更好,在9.87分钟内完成,所以这个方法应该有效。

这能解决吗:

  • 有更好的计算实例吗
  • 有更好的剧本吗
  • 一点也不,如果是的话,还有其他方法吗

[编辑以解决评论中的问题]

运行时和驱动程序摘要:

2-16 Workers 112-896 GB Memory 32-256 Cores (Standard_DS5_v2)

1 Driver 56 GB Memory, 16 Cores (Same as worker)

Runtime10.4.x-scala2.12

为了给人一个时间印象,我在下面加了一张表。

时间(分钟(
101.94
1001.92
2003.04
5009.87
100025.91
5000938.4

我认为您的案例与Spark资源配置或网络连接无关,而是与Spark设计本身有关。

简而言之,Spark是为长而窄的数据而设计的,这与您的数据帧正好相反。当你观察你的实验时,当你的列大小增加时,耗时呈指数增长。虽然这是关于读取csv而不是写入表,但你可以查看这篇文章,了解Spark不擅长处理宽数据帧的原因:尽管我增加了节点的数量,但Spark csv的读取速度非常慢

虽然我以前没有使用Azure AutoML,但基于数据集来实现您的目标,我认为您可以尝试:

  1. 尝试使用python-pandas数据帧和Hive连接库来查看是否有任何性能增强
  2. 在写入配置单元之前,将所有列连接到单个数组/向量中

相关内容

  • 没有找到相关文章

最新更新