我正在尝试加入两个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
答案 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。