apache-spark - 列表上的 Spark 数据帧操作返回 [Ljava.lang.Object;@]
问题描述
我有一个 pyspark 数据框,我在其中将数据分组以使用collect_list 列出。
from pyspark.sql.functions import udf, collect_list
from itertools import combinations, chain
#Create Dataframe
df = spark.createDataFrame( [(1,'a'), (1,'b'), (2,'c')] , ["id", "colA"])
df.show()
>>>
+---+----+
| id|colA|
+---+----+
| 1| a|
| 1| b|
| 2| c|
+---+----+
#Group by and collect to list
df = df.groupBy(df.id).agg(collect_list("colA").alias("colAlist"))
df.show()
>>>
+---+--------+
| id|colAList|
+---+--------+
| 1| [a, b]|
| 2| [c]|
+---+--------+
然后我使用一个函数来查找列表元素的所有组合到一个新列表
allsubsets = lambda l: list(chain(*[combinations(l , n) for n in range(1,len(l)+1)]))
df = df.withColumn('colAsubsets',udf(allsubsets)(df['colAList']))
所以我会期待类似的东西
+---+--------------------+
| id| colAsubsets |
+---+--------------------+
| 1| [[a], [b], [a,b]] |
| 2| [[b]] |
+---+--------------------+
但我得到:
df.show()
>>>
+---+--------+-----------------------------------------------------------------------------------------+
|id |colAList|colAsubsets |
+---+--------+-----------------------------------------------------------------------------------------+
|1 |[a, b] |[[Ljava.lang.Object;@75e2d657, [Ljava.lang.Object;@7f662637, [Ljava.lang.Object;@b572639]|
|2 |[c] |[[Ljava.lang.Object;@26f67148] |
+---+--------+-----------------------------------------------------------------------------------------+
有什么想法该怎么做?然后也许如何将列表展平为不同的行?
解决方案
改进@RameshMaharjan 的答案,以便将列表展平为不同的行:
您必须在数组上使用explode。您必须先指定 udf 的类型,以免它返回 StringType。
from pyspark.sql.functions import explode
from pyspark.sql.types import ArrayType, StringType
allsubsets = lambda l: [[z for z in y] for y in chain(*[combinations(l , n) for n in range(1,len(l)+1)])]
df = df.withColumn('colAsubsets', udf(allsubsets, ArrayType(ArrayType(StringType())))(df['colAList']))
df = df.select('id', explode('colAsubsets'))
结果 :
+---+------+
| id| col|
+---+------+
| 1| [a]|
| 1| [b]|
| 1|[a, b]|
| 2| [c]|
+---+------+
推荐阅读
- r - 随着等级的增加,值加 1
- spring - 如何使用 Spring Boot Selenium 测试获得完整的 HTTP 服务器?
- ringcentral - 多个 RingCentral 沙盒账户
- reactjs - 在 render() -> return() 中使用 Map 函数,但没有显示
- html - Chrome 76 本机延迟加载属性在 w3c 中返回错误
- regex - Apify:PseudoUrl 正则表达式以匹配包含给定关键字的 url
- python - 如果我在 python 管道中有自定义的集成模型,如何进行交叉验证和网格搜索
- php - 当 img 存在于同一行的另一个元素中时,表单提交按钮不起作用
- ios - SwiftUI Canvas 无法构建
- laravel - 控制器中的 Vue.js 和 Laravel 不存在错误分页