2016-11-06 5 views
2

LIKE 조건을 사용하여 Spark SQL에 조인을 구현하려고합니다.SQL LIKE in Spark SQL

I의 이런 모습에 가입을 수행하고 있고 '월요일 수정'라고 행 :

표 A : 8NXDPVAE

표 B : [4,8] NXD_V %의

SQL 서버 (A.revision LIKE B.revision)에서 조인을 수행하는 것은 정상적으로 작동하지만 Spark SQL에서 동일한 작업을 수행 할 때 조인은 행을 반환하지 않습니다 (내부 조인을 사용하는 경우) 또는 테이블 B에 대해 null 값을 반환합니다 (외부 조인을 사용하는 경우).).

내가 실행하고 쿼리입니다 :

스칼라> 발 합류 = spark.sql ("A.revision LIKE B.revision ON TPTYPE의 B 가입 RAWDATA 왼쪽 FROM A.revision, 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> 

IT는 LIKE이 같이 참여하거나 내가 해제 방법입니다 수행 할 수 있습니까?

답변

4

당신은 조금 벗어났습니다. - 임의의 문자와 일치

  • _ (밑줄) : LIKE 연산자는 두 개의 특수 문자를 받아들이는 경우 SQL과 하이브는 SQL 표준 규칙을 따라야 스파크.
  • % (퍼센트) - 임의의 문자 시퀀스와 일치합니다.

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

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

    당신이 자바 정규 표현식을 suports RLIKE 연산자를 사용할 수 있습니다 복잡한 패턴과 일치하려면 :

대괄호 만 [4,8] 문자 특별한 의미와 [4,8] 일치가 없다

+-----------------------------+ 
|8NXDPVAE RLIKE ^[4,8]NXD.V.*$| 
+-----------------------------+ 
|       true| 
+-----------------------------+