Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何实现自定义Pyspark分解(对于结构数组),一次分解4列?_Python 3.x_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 3.x 如何实现自定义Pyspark分解(对于结构数组),一次分解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”和“名称”字段,但缺少学生级别 我想执行一个自定义分解,这样对于

我正在尝试在Pyspark中实现自定义爆炸。我有4列,它们是具有几乎相同模式的结构数组(一列结构包含的字段比其他三列少一个)

对于数据帧中的每一行,我有4列,它们是结构数组。栏目包括学生、助教、教师、管理员

学生、助教和教师是具有字段
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