2016-11-06 49 views
2

我正在尝试使用LIKE条件在Spark SQL中实现连接。Spark SQL中的SQL LIKE

我表演上看起来像这样的连接,被称为 '修正' 行:

表A: 8NXDPVAE

表B: [4,8] NXD_V%

在SQL服务器上执行连接(A.revision LIKE B.revision)工作得很好,但是在Spark SQL中执行相同操作时,连接将不会返回表(如果使用内部连接)或空值(如果使用外部连接)。

这是我的计算机运行的查询:

阶> VAL接合= spark.sql( “选择A.revision,B.revision FROM RAWDATA左连接TPTYPE乙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加入这样还是我的方法了吗?

回答

4

你只有一点点关闭。星火SQL和蜂巢遵循SQL标准约定,其中LIKE运营商只接受两个特殊字符:

  • _(下划线) - 这相匹配的任意字符。
  • %(百分比) - 匹配任意字符序列。

方括号只有一个[4,8]字面没有特殊的含义,[4,8]比赛:

spark.sql("SELECT '[4,8]' LIKE '[4,8]'").show 
+----------------+ 
|[4,8] LIKE [4,8]| 
+----------------+ 
|   true| 
+----------------+ 

为了配合复杂的图案,你可以使用RLIKE算子suports Java正则表达式:

spark.sql("SELECT '8NXDPVAE' RLIKE '^[4,8]NXD.V.*$'").show 
+-----------------------------+ 
|8NXDPVAE RLIKE ^[4,8]NXD.V.*$| 
+-----------------------------+ 
|       true| 
+-----------------------------+