Scala 如果列表的元素作为字符串的一部分存在,则将该元素作为新列条目返回
我有一个包含几个实体的列表:Scala 如果列表的元素作为字符串的一部分存在,则将该元素作为新列条目返回,scala,apache-spark,Scala,Apache Spark,我有一个包含几个实体的列表: val list = Seq("Car", "House", "Beach") 数据如下所示: val df = spark.sparkContext.parallelize(Seq( ("Pete", "He has a Car"), ("Mike", "The Beach is beautiful"), ("Steve", "Look at this House") )).toDF("Name", "message" 我想要完成的是一个附加列,其中的值是列表
val list = Seq("Car", "House", "Beach")
数据如下所示:
val df = spark.sparkContext.parallelize(Seq(
("Pete", "He has a Car"),
("Mike", "The Beach is beautiful"),
("Steve", "Look at this House")
)).toDF("Name", "message"
我想要完成的是一个附加列,其中的值是列表中的元素(如果元素存在于message列中)
|----------------------------------|
|Name |Message |NewCol|
|----------------------------------|
|Pete |He has a Car |Car |
|Mike |The Beach is beatiful|Beach |
|Steve|Look at this House |House |
|----------------------------------|
我尝试了一些事情,但没有成功,比如
a) when($"message".isin(list:_*)
b) A udf with -> list.exists(message.contains(_))
我还考虑过将字符串与**
的正则表达式进行比较,但也无法实现
连接也是一种可能性(甚至更需要),因为列表是由数据帧的一列创建的。新列将仅用于随后与列表的原始df联接
val new_df = df.join(df_listorigin, Seq("NewCol"))
我想我现在想的太复杂了。任何帮助或想法都将不胜感激。UDF方法:
val contains = udf((m:String) => list.filter(m.contains(_)).mkString(","))
df
.withColumn("NewCol",contains($"message"))
.show()
+-----+--------------------+------+
| Name| message|NewCol|
+-----+--------------------+------+
| Pete| He has a Car| Car|
| Mike|The Beach is beau...| Beach|
|Steve| Look at this House| House|
+-----+--------------------+------+
或通过连接:
df
.join(list.toDF("NewCol"),$"message".contains($"NewCol"),"left")
.show()
+-----+--------------------+------+
| Name| message|NewCol|
+-----+--------------------+------+
| Pete| He has a Car| Car|
| Mike|The Beach is beau...| Beach|
|Steve| Look at this House| House|
+-----+--------------------+------+
UDF方法:
val contains = udf((m:String) => list.filter(m.contains(_)).mkString(","))
df
.withColumn("NewCol",contains($"message"))
.show()
+-----+--------------------+------+
| Name| message|NewCol|
+-----+--------------------+------+
| Pete| He has a Car| Car|
| Mike|The Beach is beau...| Beach|
|Steve| Look at this House| House|
+-----+--------------------+------+
或通过连接:
df
.join(list.toDF("NewCol"),$"message".contains($"NewCol"),"left")
.show()
+-----+--------------------+------+
| Name| message|NewCol|
+-----+--------------------+------+
| Pete| He has a Car| Car|
| Mike|The Beach is beau...| Beach|
|Steve| Look at this House| House|
+-----+--------------------+------+
如果
消息
中有多个单词在列表
中怎么办?对不起,我忘了添加此信息。这种情况永远不会发生。如果消息
中有多个单词在列表
中怎么办?对不起,我忘了添加此信息。这个案子永远不会发生,非常感谢。正如我所想:D我走错了方向。我使用了您提供的加入版本。对于未来的读者,有一件事需要注意:UDF方法只有在列表中的元素仅由单个单词元素组成时才有效。join appraoch还可以处理多个单词元素(就像我的例子一样),非常感谢。正如我所想:D我走错了方向。我使用了您提供的加入版本。对于未来的读者,有一件事需要注意:UDF方法只有在列表中的元素仅由单个单词元素组成时才有效。join appraoch还可以处理多个单词元素(就像我的例子一样)