如何在给定条件-Python的情况下将数据帧行分为两个行



我有一个火花数据帧如下,

+-------+-------+-----+
|  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|
+-----+---+

相关内容

  • 没有找到相关文章

最新更新