pyspark - pyspark:将结构分解成列
问题描述
我创建了一个 udf,它返回一个未嵌套的 StructType。只是一个带有字段名称的混合类型(int、float)的数组。我想将它们分解/拆分成单独的列。请注意,这将创建大约 50 个新列。通过谷歌搜索,我找到了这个解决方案:
df_split = df.select('ID', 'my_struct.*')
这行得通。但是性能绝对糟糕,例如。无法使用。检查集群节点,这也仅使用 1 个核心。但这只能解释问题的一小部分。
那么什么是实现我的目标的好方法,为什么上面的解决方案这么慢?
编辑:
似乎是 udf 和拆分的特定组合导致性能不佳。这很慢:
df_udf = df.withColumn('udf', my_udf(df.input))
df_exploded = df_udf.select('input', 'udf.*')
df_exploded.show(5)
这很快:
df_udf = df.withColumn('udf', my_udf(df.input))
df_udf.cache()
df_exploded = df_udf.select('input', 'udf.*')
df_exploded.show(5)
解决方案
根据要求,我正在编辑答案。请考虑到,这在我的情况下适用于一个小型测试集群(5 个节点),只有我使用相对较小的数据集(5000 万)处理它。
似乎是 udf 和 split 的特定组合导致性能不佳。这很慢:
df_udf = df.withColumn('udf', my_udf(df.input))
df_exploded = df_udf.select('input', 'udf.*')
df_exploded.show(5)
这很快:
df_udf = df.withColumn('udf', my_udf(df.input))
df_udf.cache()
df_exploded = df_udf.select('input', 'udf.*')
df_exploded.show(5)
推荐阅读
- ios - UISearchController - 搜索文本清除图标不完全隐藏
- php - Laravel 获取具有关系的用户帖子
- asp.net - 如何使用 Space 在 XML 文件中创建节点?
- react-native - 只有一些导航器的不变违规(React-Navigation)
- excel - 在 Excel 中获取 Access 数据“不包含可见表”
- windows - COBOL - 调用 Windows API Getsysteminfo()
- php - Google Drive API 导出使用 application/zip MIME 获取空内容
- c# - C#:使用同步、异步或异步与共享 HttpClient 时的不同结果
- python - 如何将套接字添加到 listWidget
- oauth-2.0 - OAuth2、API 和 JavaScript 应用程序 - 令牌验证服务器端还是客户端?