在Dataframe中使用字符串函数在scala中加入

时间:2017-11-02 13:30:36

标签: scala apache-spark apache-spark-sql

我正在尝试加入两个dataframe条件,例如" Wo" in" Hello World"即(dataframe1 col包含dataframe2 col1值)。

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

如何在Scala中的Dataframe中实现同样的条件?我试过了

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

但它给我带来了以下错误

  

错误:value indexOfSlice不是其成员   org.apache.spark.sql.Column

我只是想使用DataFrames来实现下面的hql查询。

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

1 个答案:

答案 0 :(得分:2)

使用 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:小心!使用交叉连接是一项昂贵的操作,因为它会产生笛卡尔连接。

编辑:如果您想使用此解决方案,请考虑阅读this