我正在尝试使用LIKE条件在Spark SQL中实现联接。
我正在执行联接的行如下所示,称为“修订”:
表A:
8NXDPVAE
表B:
[4,8]NXD_V%
在SQL Server(A.revision LIKE B.revision)上执行联接效果很好,但是在Spark SQL中执行联接时,联接不返回任何行(如果使用内部联接),或者不返回表B的空值(如果使用外部联接)。
A.revision LIKE B.revision
这是我正在运行的查询:
val joined = spark.sql("SELECT A.revision, B.revision FROM RAWDATA A LEFT JOIN TPTYPE B ON A.revision LIKE B.revision")
该计划如下所示:
== Physical Plan == BroadcastNestedLoopJoin BuildLeft, LeftOuter, revision#15 LIKE revision#282, false :- BroadcastExchange IdentityBroadcastMode : +- *Project [revision#15] : +- *Scan JDBCRelation(RAWDATA) [revision#15] PushedFilters: [EqualTo(bulk_id,2016092419270100198)], ReadSchema: struct<revision> +- *Scan JDBCRelation(TPTYPE) [revision#282] ReadSchema: struct<revision>
是否可以像这样执行LIKE加入?
您只有一点点离开。Spark SQL和Hive遵循SQL标准约定,其中LIKE运算符仅接受两个特殊字符:
LIKE
_
%
方括号没有特殊含义,[4,8]仅与[4,8]文字匹配:
[4,8]
spark.sql("SELECT '[4,8]' LIKE '[4,8]'").show +----------------+ |[4,8] LIKE [4,8]| +----------------+ | true| +----------------+
要匹配复杂的模式,可以使用RLIKE支持Java正则表达式的运算符:
RLIKE
spark.sql("SELECT '8NXDPVAE' RLIKE '^[4,8]NXD.V.*$'").show +-----------------------------+ |8NXDPVAE RLIKE ^[4,8]NXD.V.*$| +-----------------------------+ | true| +-----------------------------+