Python 3.x 如何实现自定义Pyspark分解(对于结构数组),一次分解4列?
我正在尝试在Pyspark中实现自定义爆炸。我有4列,它们是具有几乎相同模式的结构数组(一列结构包含的字段比其他三列少一个) 对于数据帧中的每一行,我有4列,它们是结构数组。栏目包括学生、助教、教师、管理员 学生、助教和教师是具有字段Python 3.x 如何实现自定义Pyspark分解(对于结构数组),一次分解4列?,python-3.x,apache-spark,pyspark,apache-spark-sql,Python 3.x,Apache Spark,Pyspark,Apache Spark Sql,我正在尝试在Pyspark中实现自定义爆炸。我有4列,它们是具有几乎相同模式的结构数组(一列结构包含的字段比其他三列少一个) 对于数据帧中的每一行,我有4列,它们是结构数组。栏目包括学生、助教、教师、管理员 学生、助教和教师是具有字段id、student\u level和name的结构数组 例如,下面是DataFrame中的一个示例行 学生、助教和教师结构都具有相同的模式(“id”、“学生级别”、“名称”),管理员结构具有“id”和“名称”字段,但缺少学生级别 我想执行一个自定义分解,这样对于
id
、student\u level
和name
的结构数组
例如,下面是DataFrame中的一个示例行
学生、助教和教师结构都具有相同的模式(“id”、“学生级别”、“名称”),管理员结构具有“id”和“名称”字段,但缺少学生级别
我想执行一个自定义分解,这样对于每一行,我都会为每个学生、助教、教授和管理员提供一个条目,以及原始列名,以防我必须按“人员类型”进行搜索。
因此,对于上面一行的屏幕截图,输出将是8行:
+-----------+---------------------+----+---------------+----------+
| School_id | type | id | student_level | name |
+-----------+---------------------+----+---------------+----------+
| 1999 | students | 1 | 0 | Brian |
| 1999 | students | 9 | 2 | Max |
| 1999 | teaching_assistants | 19 | 0 | Xander |
| 1999 | teachers | 21 | 0 | Charlene |
| 1999 | teachers | 12 | 2 | Rob |
| 1999 | administrators | 23 | None | Marsha |
| 1999 | administrators | 11 | None | Ryan |
| 1999 | administrators | 14 | None | Bob |
+-----------+---------------------+----+---------------+----------+
对于管理员来说,student_level列将为空。问题是,如果我使用explode函数,我最终会在不同的列中显示所有这些项
有可能在Pyspark中实现这一点吗?我的一个想法是找出如何将4个数组列组合成1个数组,然后对数组进行分解,尽管我不确定组合结构数组并将列名作为字段是否可行(我尝试了各种方法),而且我也不知道如果管理员缺少字段,这是否可行
在过去,我通过转换为RDD并使用flatmap/自定义udf来实现这一点,但对于数百万行来说,这是非常低效的。这个想法是用来转换列学生
,教学助理
,教师
和管理员
分成单独的行,每个类型都有正确的值
。之后,可以分解包含数据的列,然后将单个结构的元素转换为单独的列
使用stack
要求堆叠的所有列具有相同的类型。这意味着所有列必须包含相同结构的数组,并且结构的所有元素的可空性必须匹配。因此,administrators
列必须首先转换为正确的结构类型
df.withColumn(“管理员”,F.expr(“转换(管理员)”+
“a->if(1