Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 检查一行中多个列的内容,并根据内容添加具有值的新列_Scala_Apache Spark - Fatal编程技术网

Scala 检查一行中多个列的内容,并根据内容添加具有值的新列

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内

我有一个包含频道信息的数据集。 我现在要做的是聚合f.e.以X_u开始的所有通道,如果其中一个状态值为“不正常”,则新列中的值也应为“不正常”,否则为“正常”

我已经通过将OK和not okay映射到0和1,其中“not okay”=1和“okay”=0,得到了类似的结果。 然后,我将所有列汇总为一个新列,如果新列中的值大于0,那么很明显其中一列必须包含一个“not okay”


我很想摆脱字符串到整数的映射,因为我认为这会降低计算速度。

您可以通过使用
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|
+-----------------+-----------------+-----------------+-----------------+----------------+--------+