Scala 检查一行中多个列的内容,并根据内容添加具有值的新列
我有一个包含频道信息的数据集。 我现在要做的是聚合f.e.以X_u开始的所有通道,如果其中一个状态值为“不正常”,则新列中的值也应为“不正常”,否则为“正常” 我已经通过将OK和not okay映射到0和1,其中“not okay”=1和“okay”=0,得到了类似的结果。 然后,我将所有列汇总为一个新列,如果新列中的值大于0,那么很明显其中一列必须包含一个“not okay”Scala 检查一行中多个列的内容,并根据内容添加具有值的新列,scala,apache-spark,Scala,Apache Spark,我有一个包含频道信息的数据集。 我现在要做的是聚合f.e.以X_u开始的所有通道,如果其中一个状态值为“不正常”,则新列中的值也应为“不正常”,否则为“正常” 我已经通过将OK和not okay映射到0和1,其中“not okay”=1和“okay”=0,得到了类似的结果。 然后,我将所有列汇总为一个新列,如果新列中的值大于0,那么很明显其中一列必须包含一个“not okay” 我很想摆脱字符串到整数的映射,因为我认为这会降低计算速度。您可以通过使用array\u contains和array内
我很想摆脱字符串到整数的映射,因为我认为这会降低计算速度。您可以通过使用
array\u contains
和array
内置函数,当然也可以使用with column
函数来满足您的要求。但在此之前,您需要找到以X开头的列名来检查条件
然后使用列名在否则
import org.apache.spark.sql.functions._
df.withColumn("new_col", when(array_contains(array(xStartingCols.map(col): _*), "not okay") === lit(true), "not okay").otherwise("okay"))
您应该具有所需的输出dataframe
+-----------------+-----------------+-----------------+-----------------+----------------+--------+
|X_ChannelA_status|Y_ChannelB_status|X_ChannelC_status|X_ChannelD_status|X_channel_status|new_col |
+-----------------+-----------------+-----------------+-----------------+----------------+--------+
|okay |okay |okay |okay |true |okay |
|not okay |not okay |not okay |not okay |true |not okay|
+-----------------+-----------------+-----------------+-----------------+----------------+--------+
谢谢,我不知道数组包含什么。工作起来很有魅力。我真的很想避免使用udf。很高兴听到@user2811630,谢谢你的投票和接受
val xStartingCols = df.columns.filter(_.startsWith("X"))
import org.apache.spark.sql.functions._
df.withColumn("new_col", when(array_contains(array(xStartingCols.map(col): _*), "not okay") === lit(true), "not okay").otherwise("okay"))
+-----------------+-----------------+-----------------+-----------------+----------------+--------+
|X_ChannelA_status|Y_ChannelB_status|X_ChannelC_status|X_ChannelD_status|X_channel_status|new_col |
+-----------------+-----------------+-----------------+-----------------+----------------+--------+
|okay |okay |okay |okay |true |okay |
|not okay |not okay |not okay |not okay |true |not okay|
+-----------------+-----------------+-----------------+-----------------+----------------+--------+