【问题标题】:Using of String Functions in Dataframe Join in scala在 Scala 中使用数据框连接中的字符串函数
【发布时间】:2017-11-02 13:30:36
【问题描述】:

我正在尝试加入两个dataframe,条件类似于“Hello World”中的“Wo”,即(dataframe1 col 包含 dataframe2 col1 值)。

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

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

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

但它抛出了以下错误

错误:值 indexOfSlice 不是 org.apache.spark.sql.Column

我只想使用 DataFrames 实现以下 hql 查询。

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

【问题讨论】:

  • 首先,这是一个特定于 spark 的问题,应使用 apache-spark 进行标记。其次,不清楚你在做什么。您实际上是在尝试使用条件执行交叉连接吗?另外,您不介意展示一个 MVCE,以便我们尝试提供帮助吗?错误是显而易见的想法
  • @eliasah 是的,我正在尝试交叉连接。我将在问题中添加 sql 示例...

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


【解决方案1】:

以下解决方案使用 spark 2.2 进行了测试。您将需要定义一个 UDF 并且您可以将 join 条件 指定为 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

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多