在 scala 中的数据帧联接中使用字符串函数



我正在尝试连接两个条件为"Wo"的dataframe,即(数据帧 1 col 包含数据帧 2 col1 值)。

在 HQL 中,我们可以使用instr(t1.col1,t2.col1)>0

如何在 Scala 的数据帧中实现相同的条件?我试过了

df1.join(df2,df1("col1").indexOfSlice(df2("col1")) > 0)

但它给我抛出了以下错误

错误:值索引切片不是 的成员 org.apache.spark.sql.Column

我只想使用数据帧实现以下 hql 查询。

select t1.*,t2.col1 from t1,t2 where instr(t1.col1,t2.col1)>0

以下解决方案使用 Spark 2.2 进行测试。您需要定义一个UDF并且可以指定一个连接条件作为筛选器的一部分where

val indexOfSlice_ = (c1: String, c2: String) => c1.indexOfSlice(c2)
val islice = udf(indexOfSlice_)
val df10: DataFrame = Seq(("Hello World", 2), ("Foo", 3)).toDF("c1", "c2")
val df20: DataFrame = Seq(("Wo", 2), ("Bar", 3)).toDF("c3", "c4")
df10.crossJoin(df20).where(islice(df10.col("c1"), df20.col("c3")) > 0).show
// +-----------+---+---+---+
// |         c1| c2| c3| c4|
// +-----------+---+---+---+
// |Hello World|  2| Wo|  2|
// +-----------+---+---+---+

PS:小心!使用交叉连接是一项昂贵的操作,因为它会产生笛卡尔连接。

编辑:当您想使用此解决方案时,请考虑阅读此内容。

相关内容

  • 没有找到相关文章

最新更新