首页 > 解决方案 > Spark:动态构造连接表达式

问题描述

我必须使用连接表达式连接两个数据集:

ds1.join(ds2, joinExpr)

joinExpr例如可以是ds1.col(price).equals(ds2.price)

但我必须使用外部属性文件动态外部化连接列:

-price
-name
-adress
...

是否可以动态构造这个表达式?

标签: javaapache-spark

解决方案


您可以使用expr(String)作为joinExpr. 字符串参数可以是任何可以从配置文件加载或构造的有效 SQL 表达式。

import static org.apache.spark.sql.functions.*;

//construct test data
df1 = ...
//+---+---+
//|  a|  b|
//+---+---+
//|  1|  2|
//|  3|  4|
//+---+---+

df2 = ...
//+---+---+
//|  c|  d|
//+---+---+
//|  1|  1|
//|  3|  5|
//+---+---+

//define the join condition. It could be loaded from a file
String joinCondition = "a=c and b>d";

df1.join(df2, expr(joinCondition)).show();

//+---+---+---+---+                                                               
//|  a|  b|  c|  d|
//+---+---+---+---+
//|  1|  2|  1|  1|
//+---+---+---+---+

推荐阅读