Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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,我有一个包含几个实体的列表: 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还可以处理多个单词元素(就像我的例子一样)