在 Spark 中连接两个数据帧

Posted

技术标签:

【中文标题】在 Spark 中连接两个数据帧【英文标题】:Joining two dataframes in Spark 【发布时间】:2016-02-19 00:37:31 【问题描述】:

当我尝试使用

连接两个数据框时
DataFrame joindf = dataFrame.join(df, df.col(joinCol)); //.equalTo(dataFrame.col(joinCol)));

我的程序抛出异常

org.apache.spark.sql.AnalysisException:连接条件“url”类型 字符串不是布尔值。;

这里 joinCol 的值是 url 需要输入作为可能导致这些异常的原因

【问题讨论】:

【参考方案1】:

join 作为第二个参数的变体 Column 期望它可以被评估为布尔表达式。

如果您想要基于列名的简单等值连接,请使用a version which takes a column name as a String

String joinCol = "foo";
dataFrame.join(df, joinCol);

【讨论】:

【参考方案2】:

这意味着连接条件应该评估为表达式。假设我们想根据 id 加入 2 个数据帧,所以我们可以做的是:使用 Python:

df1.join(df2, df['id'] == df['id'], 'left')  # 3rd parameter is type of join which in this case is left join

使用 Scala:

df1.join(df2, df('id') === df('id'))    // create inner join based on id column

【讨论】:

【参考方案3】:

你不能使用 df.col(joinCol) 因为这不是一个表达式。为了加入 2 个数据框,您需要确定要加入的列

假设您有一个 DataFrame emp 和 dept,在 Scala 中连接这两个数据帧应该如下所示

empDF.join(deptDF,empDF("emp_dept_id") ===  deptDF("dept_id"),"inner")
    .show(false)

本例取自Spark SQL Join DataFrames

【讨论】:

以上是关于在 Spark 中连接两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Spark sql连接两个没有主键的数据帧

我们如何使用 SQL 风格的“LIKE”标准连接两个 Spark SQL 数据帧?

如何加快 Spark 中的大数据框连接

Apache Spark:广播连接不适用于缓存的数据帧

SPARK - 在数组中的值上连接 2 个数据帧

Tableau + Spark SQL 连接器 + Java Spark 数据帧