spark scala在另一个Dataframe中查找值

uqjltbpv  于 2021-05-18  发布在  Spark
关注(0)|答案(2)|浏览(657)

你好,我是一个新的Spark,我需要这个小练习的帮助。我想在另一个Dataframe中找到某些值,但如果这些值不存在,我想减少每个值的长度,直到找到匹配的值。我有这些Dataframe:

----------------
|values_to_find|
----------------
|    ABCDE     |
|    CBDEA     | 
|    ACDEA     |
|    EACBA     |
----------------
------------------
|  list    | Id  |
------------------
|  EAC     |  1  |
|  ACDE    |  2  |
|  CBDEA   |  3  |
|  ABC     |  4  |
------------------

我期待下一个结果:

--------------------------------
| Id  | list  | values_to_find |
--------------------------------
|  4  | ABC   |      ABCDE     | 
|  3  | CBDEA |      CBDEA     |
|  2  | ACDE  |      ACDEA     |
|  1  | EAC   |      EACBA     |
--------------------------------

例如de不存在,所以我将它的长度减少1(d),再次它与任何长度都不匹配,所以我再次减少它,这次我得到了,它匹配,所以我使用该值联接并形成一个新的Dataframe。减少长度时不必担心重复值,但我需要找到完全匹配的值。另外,如果可能的话,我希望避免使用自定义项。
我使用foreach来获取第一个Dataframe中的每个值,并且我可以在那里执行子字符串(如果没有匹配项),但是我不确定如何在第二个Dataframe中查找这些值。最好的方法是什么?我已经看到了大量的自定义项可以做到这一点,但我想避免这一点,如前所述。

df1.foreach { values_to_find =>
        df1.get(0).toString.substring(0, 4)}

编辑:那些Dataframe是例子,我有更多的价值观,解决方案应该是动态的。。。迭代一些值并在另一个Dataframe中找到它们的匹配项,如果不存在的话,我需要减少它们的长度。
谢谢你的帮助!

bvjxkvbb

bvjxkvbb1#

您可以将dataframe作为临时视图加载并编写sql。上面的场景是您第一次在spark中实现,还是已经在前面的代码中实现了(我的意思是在spark之前您已经在遗留系统中实现了)。使用spark,您可以自由地用scala编写udf或使用sql。对不起,我手边没有解决办法,所以给点提示。

n3ipq98p

n3ipq98p2#

以下内容将对您有所帮助。

val dataDF1  = Seq((4,"ABC"),(3,"CBDEA"),(2,"ACDE"),(1,"EAC")).toDF("Id","list")
 val dataDF2  = Seq(("ABCDE"),("CBDEA"),("ACDEA"),("EACBA")).toDF("compare")

 dataDF1.createOrReplaceTempView("table1")
 dataDF2.createOrReplaceTempView("table2")

spark.sql("select * from table1 inner join table2 on table1.list like concat('%',SUBSTRING(table2.compare,1,3),'%')").show()

输出:

+---+-----+-------+
| Id| list|compare|
+---+-----+-------+
|  4|  ABC|  ABCDE|
|  3|CBDEA|  CBDEA|
|  2| ACDE|  ACDEA|
|  1|  EAC|  EACBA|
+---+-----+-------+

相关问题