Apache spark 使用regex在多个列上运行函数时

Apache spark 使用regex在多个列上运行函数时,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我需要在多个(百分之一)列上应用when函数。 我想检查是否至少有一列包含特定值 还有比这更好的方法吗 df.withColumn("any value", F.when( (col("check1") == "value") | (col("check2") == "value") | (col("check3") == "value")

我需要在多个(百分之一)列上应用when函数。 我想检查是否至少有一列包含特定值

还有比这更好的方法吗

df.withColumn("any value", F.when(
   (col("check1") == "value") |
   (col("check2") == "value") |
   (col("check3") == "value") |
   (col("check4") == "value") |
   ...
   , True)
使用正则表达式是否可以这样做?

您可以使用
f.lit(True).isin(*列)
来检测任何真值:

boolean\u columns=[f.col(name)表示名称,\u如果[u type=='boolean',则键入df.dtypes]
df=df.withColumn('any true',f.lit(true).isin(*boolean_columns))
您可以使用
f.lit(True).isin(*列)
检测任何真值:

boolean\u columns=[f.col(name)表示名称,\u如果[u type=='boolean',则键入df.dtypes]
df=df.withColumn('any true',f.lit(true).isin(*boolean_columns))

您可以检查
值是否在所有列的数组中。请注意,我使用的列表理解与UDF不相似。这是一个完全正常的标准Pypark操作

#示例数据
# +---+---+---+---+
#| a | b | c | d|
# +---+---+---+---+
#| A | B | C | D|
#| B | C | D | A|
#| B | C | D | E|
# +---+---+---+---+
df.withColumn('random',F.lit('A').isin([F.col(c)表示df.columns中的c])).show()
# +---+---+---+---+------+
#| a | b | c | d |随机|
# +---+---+---+---+------+
#| A | B | C | D |正确|
#| B | C | D | A |对|
#| B | C | D | E |假|
# +---+---+---+---+------+

您可以检查
值是否在所有列的数组中。请注意,我使用的列表理解与UDF不相似。这是一个完全正常的标准Pypark操作

#示例数据
# +---+---+---+---+
#| a | b | c | d|
# +---+---+---+---+
#| A | B | C | D|
#| B | C | D | A|
#| B | C | D | E|
# +---+---+---+---+
df.withColumn('random',F.lit('A').isin([F.col(c)表示df.columns中的c])).show()
# +---+---+---+---+------+
#| a | b | c | d |随机|
# +---+---+---+---+------+
#| A | B | C | D |正确|
#| B | C | D | A |对|
#| B | C | D | E |假|
# +---+---+---+---+------+

您的代码中的正则表达式在哪里?正则表达式不是问题所在。我只想知道是否有可能检查多个列是否为真。正则表达式在代码中的位置是什么?正则表达式不是问题所在。我只是想知道是否有可能检查多个列是否为真。您要求使用regex,但我给出了另一个看起来更简单的解决方案。我希望避免写入所有列。这就是正则表达式解决方案的原因。:-)所有这些列的类型都是布尔型的吗?如果你能发布你的.printSchema()输出会有帮助。@Dusty我更新了我的答案,考虑到在布尔类型的所有列中搜索
True
,isin函数是否应该以其他方式使用?您正在使用类似于udf的列表理解。我认为代码会崩溃。你要求使用正则表达式,但我给出了另一个看起来更简单的解决方案。我希望避免编写所有列。这就是正则表达式解决方案的原因。:-)所有这些列的类型都是布尔型的吗?如果你能发布你的.printSchema()输出会有帮助。@Dusty我更新了我的答案,考虑到在布尔类型的所有列中搜索
True
,isin函数是否应该以其他方式使用?您正在使用类似于udf的列表理解。我想代码会崩溃。太好了!非常感谢。如果这都是PySpark,我想这和手动写入所有要检查的列一样快。太好了!非常感谢。如果这都是PySpark,我想这与手动写入所有要检查的列一样快。