2017-01-25 8 views
3

일부 문자열 값을 숫자로 변환하려면 임팔라에서 fnv_hash을 사용하고 있습니다. 이제 Spark SQL로 마이그레이션 할 예정입니다. Spark SQL과 비슷한 기능을 사용할 수 있습니까? 숫자에 대한 문자열 값을 거의 1-1로 매핑하는 함수가 작동합니다. 감사!임팔라 대 스파크 SQL : 내장 함수 변환 : fnv_hash

답변

1

불행히도 Spark은 직접 교체를 제공하지 않습니다. 내장형 o.a.s.sql.functions.hash/pyspark.sql.functions.hash은 MurmurHash 3, which should have comparable properties with the same hash size을 사용하지만 Spark는 32 ​​비트 해시를 사용합니다 (임팔라에서는 64 비트 fnv_hash과 비교). 이 허용되는 경우 단지 hash를 가져오고 당신은 갈 수 있어요 : 당신이 더 필요한 경우

from pyspark.sql.functions import hash as hash_ 

df = sc.parallelize([("foo",), ("bar",)]).toDF(["foo"]) 

df.select(hash_("foo")) 
DataFrame[hash(foo): int] 

당신이 XXH64 좀 걸릴 수 있습니다. SQL 함수를 사용하여 직접 노출되지는 않지만 Catalyst expression은 공용이므로 간단한 래퍼 만 있으면됩니다. 이 같은 대략 뭔가 :

package com.example.spark.sql 

import org.apache.spark.sql.Column 
import org.apache.spark.sql.catalyst.expressions.XxHash64 

object functions { 
    def xxhash64(cols: Column*): Column = new Column(
    new XxHash64(cols.map(_.expr)) 
) 
} 
from pyspark import SparkContext 
from pyspark.sql.column import Column, _to_java_column, _to_seq 

def xxhash64(*cols): 
    sc = SparkContext._active_spark_context 
    jc = sc._jvm.com.example.spark.sql.functions.xxhash64(
     _to_seq(sc, cols, _to_java_column) 
    ) 
    return Column(jc) 

df.select(xxhash64("foo")) 
DataFrame[xxHash(foo): bigint]