pyspark:将结构分解为列

pyspark:将结构分解为列,pyspark,user-defined-functions,Pyspark,User Defined Functions,我创建了一个udf,它返回一个未嵌套的StructType。只需一个包含字段名的混合类型(int、float)的and数组。我想将它们分解/拆分为单独的列。请注意,这将创建大约50个新列。通过谷歌搜索,我找到了这个解决方案: df_split = df.select('ID', 'my_struct.*') 这很有效。然而,性能绝对糟糕,如无法使用。在群集节点上检查这也只使用1个核心。但这只能解释问题的一小部分 那么,实现我的目标的好方法是什么?为什么上述解决方案如此缓慢 编辑: 似乎是udf

我创建了一个udf,它返回一个未嵌套的StructType。只需一个包含字段名的混合类型(int、float)的and数组。我想将它们分解/拆分为单独的列。请注意,这将创建大约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_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)
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和拆分的特定组合导致了性能低下。这很慢:

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_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)
df_udf = df.withColumn('udf', my_udf(df.input))
df_udf.cache()
df_exploded = df_udf.select('input', 'udf.*')
df_exploded.show(5)

您在“编辑”中输入的内容是否解决了您的问题?如果是这样的话,你可以给出一个答案并接受它,这样人们就不会花时间去解决已经做过的事情。好吧,它确实为我解决了这个问题,但我不确定它是否是一个普遍可行的解决方案。这是一个教育项目,运行在一个只有我使用和完全控制的小型集群上。大型数据集上的AFAIK缓存会给集群带来严重的内存压力吗?