Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 如何通过一个数组列调整pySpark数据帧?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 如何通过一个数组列调整pySpark数据帧?

Python 如何通过一个数组列调整pySpark数据帧?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有这样一个spark数据框: +------+--------+--------------+--------------------+ | dbn| boro|total_students| sBus| +------+--------+--------------+--------------------+ |17K548|Brooklyn| 399|[B41, B43, B44-SB...| |09X543| Bronx|

我有这样一个spark数据框:

+------+--------+--------------+--------------------+
|   dbn|    boro|total_students|                sBus|
+------+--------+--------------+--------------------+
|17K548|Brooklyn|           399|[B41, B43, B44-SB...|
|09X543|   Bronx|           378|[Bx13, Bx15, Bx17...|
|09X327|   Bronx|           543|[Bx1, Bx11, Bx13,...|
+------+--------+--------------+--------------------+
+------+--------+--------------+--------------------+
|   dbn|    boro|total_students|                sBus|
+------+--------+--------------+--------------------+
|17K548|Brooklyn|           399| B41                |
|17K548|Brooklyn|           399| B43                |
|17K548|Brooklyn|           399| B44-SB             |
+------+--------+--------------+--------------------+
如何使它更平滑,以便为SBU中的每个元素复制每一行,并且SBU将是一个普通的字符串列

所以结果是这样的:

+------+--------+--------------+--------------------+
|   dbn|    boro|total_students|                sBus|
+------+--------+--------------+--------------------+
|17K548|Brooklyn|           399|[B41, B43, B44-SB...|
|09X543|   Bronx|           378|[Bx13, Bx15, Bx17...|
|09X327|   Bronx|           543|[Bx1, Bx11, Bx13,...|
+------+--------+--------------+--------------------+
+------+--------+--------------+--------------------+
|   dbn|    boro|total_students|                sBus|
+------+--------+--------------+--------------------+
|17K548|Brooklyn|           399| B41                |
|17K548|Brooklyn|           399| B43                |
|17K548|Brooklyn|           399| B44-SB             |
+------+--------+--------------+--------------------+

等等…

我想不出一种不把它转换成RDD的方法来实现这一点

#将df转换为rdd
rdd=df.rdd
def提取(行,键):
“”“获取字典和键,返回(dict w/o key,dict[key])的元组。”
_dict=行。asDict()
_列表=_dict[键]
del_dict[键]
返回(_dict,_list)
def add_to_dict(_dict,key,value):
_dict[键]=值
返回命令
#保留键中的其余值,将列表中的值展平
rdd=rdd.map(lambda x:extract(x,'sBus'))
#为值中的每个项目创建一行
rdd=rdd.flatMapValues(λx:x)
#将平铺值添加回字典
rdd=rdd.map(lambda x:add_to_dict(x[0],'sBus',x[1]))
#转换回数据帧
df=sqlContext.createDataFrame(rdd)
df.show()
棘手的部分是将其他列与新展平的值保持在一起。为此,我将每一行映射到
的元组(其他列的dict,要展平的列表)
,然后调用。这将把值列表的每个元素分割成一个单独的行,但保持键的连接,即

(key, ['A', 'B', 'C'])
变成

(key, 'A')
(key, 'B')
(key, 'C')

然后,我将展平的值移回其他列的字典中,并将其重新转换回数据帧。

您能提供预期的输出吗?您是否期望结果是
sBus
sSw
之间的笛卡尔积?谢谢!添加了预期结果。为了简单起见,删除了sSw columnWell,您可以使用
explode
(例如,请参见),但如果您有多个列,就没有那么简单了。