我有一个火花数据帧如下,
+-------+-------+-----+
| s1 | s2 |isVal|
+-------+-------+-----+
|a |aa | 1|
|b |bb | 0|
|c |cc | 1|
|d |dd | 0|
|e |ee | 1|
+-------+-------+-----+
我想在每一行中检查 iSVAL 值,如果该值等于 1 ,则该行应分为两个行。上述数据框的前两行,结果应如下,
+-------+-------+
| s1 | isVal|
+-------+-------+
|a | 1|
|aa | 1|
|b | 0|
+-------+-------+
请使用Python帮助构建逻辑。我试图使用FlatMap构建逻辑,但没有提供预期的结果。
这是解决方案。
>>> from pyspark.sql.functions import array, col, explode
>>>
>>> d = [{'s1': 'a', 's2': 'aa', 'isVal':1}, {'s1': 'b', 's2': 'bb', 'isVal':0}, {'s1': 'c', 's2': '
cc', 'isVal':1}, {'s1': 'd', 's2': 'dd', 'isVal':0}]
>>> df = spark.createDataFrame(d)
>>> df.show()
+-----+---+---+
|isVal| s1| s2|
+-----+---+---+
| 1| a| aa|
| 0| b| bb|
| 1| c| cc|
| 0| d| dd|
+-----+---+---+
>>> df1 = df.where(col("isVal")==1).withColumn("s3",array(col("s1"), col("s2"))).select(col("s3"), col("isVal")).withColumn("s1",explode(col("s3"))).drop(col("s3"))
>>> df0 = df.select(col("isVal"), col("s1")).where(col("isVal")==0)
>>> df2 = df1.union(df0)
>>> df2.show()
+-----+---+
|isVal| s1|
+-----+---+
| 1| a|
| 1| aa|
| 1| c|
| 1| cc|
| 0| b|
| 0| d|
+-----+---+