Pyspark:将一列与其他列进行比较,如果相似则进行标记
Pyspark: compare one column with other columns and flag if similar
我想创建一个列,如果在 column2、column3 或 column4 中找到我的 column1 值,它会进行标记。
我可以这样做:
import pyspark.sql.functions as f
df.withColumn("FLAG", f.when((f.col("column1") == f.col("column2")) |
(f.col("column1") == f.col("column3")) |
(f.col("column1") == f.col("column4")), 'Y')\
.otherwise('N'))
这需要相当长的时间,而且我觉得效率很低。我想知道是否有更好的方法使用 UDF 来编写此代码?我正在尝试弄清楚如何引用匹配的列。
任何帮助都有帮助!谢谢
您可以使用 Spark 内置函数 isin
from pyspark.sql import functions as F
df = (spark
.sparkContext
.parallelize([
('A', 'A', 'B', 'C'),
('A', 'B', 'C', 'A'),
('A', 'C', 'A', 'B'),
('A', 'X', 'Y', 'Z'),
])
.toDF(['ca', 'cb', 'cc', 'cd'])
)
(df
.withColumn('flag', F.col('ca').isin(
F.col('cb'),
F.col('cc'),
F.col('cd'),
))
.show()
)
# +---+---+---+---+-----+
# | ca| cb| cc| cd| flag|
# +---+---+---+---+-----+
# | A| A| B| C| true|
# | A| B| C| A| true|
# | A| C| A| B| true|
# | A| X| Y| Z|false|
# +---+---+---+---+-----+
我想创建一个列,如果在 column2、column3 或 column4 中找到我的 column1 值,它会进行标记。
我可以这样做:
import pyspark.sql.functions as f
df.withColumn("FLAG", f.when((f.col("column1") == f.col("column2")) |
(f.col("column1") == f.col("column3")) |
(f.col("column1") == f.col("column4")), 'Y')\
.otherwise('N'))
这需要相当长的时间,而且我觉得效率很低。我想知道是否有更好的方法使用 UDF 来编写此代码?我正在尝试弄清楚如何引用匹配的列。
任何帮助都有帮助!谢谢
您可以使用 Spark 内置函数 isin
from pyspark.sql import functions as F
df = (spark
.sparkContext
.parallelize([
('A', 'A', 'B', 'C'),
('A', 'B', 'C', 'A'),
('A', 'C', 'A', 'B'),
('A', 'X', 'Y', 'Z'),
])
.toDF(['ca', 'cb', 'cc', 'cd'])
)
(df
.withColumn('flag', F.col('ca').isin(
F.col('cb'),
F.col('cc'),
F.col('cd'),
))
.show()
)
# +---+---+---+---+-----+
# | ca| cb| cc| cd| flag|
# +---+---+---+---+-----+
# | A| A| B| C| true|
# | A| B| C| A| true|
# | A| C| A| B| true|
# | A| X| Y| Z|false|
# +---+---+---+---+-----+