Python 如何通过一个数组列调整pySpark数据帧?
我有这样一个spark数据框: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|
+------+--------+--------------+--------------------+
| 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
(例如,请参见),但如果您有多个列,就没有那么简单了。