2017-02-14 15 views
0

Я экспериментировал с Quantlib и Спарк, пытаясь передать функцию Quantlib в Pyspark пример ниже:Pyspark UDF с помощью функции Quantlib

from QuantLib import * 
from pyspark.sql.types import StringType 
from pyspark.sql.functions import udf 


df = sc.parallelize([("2016-10-01",), 
        ("2016-11-01",), 
        ("2016-12-01",)]).toDF(['someDate']) 

testudf = udf(lambda x: str(DateParser.parseFormatted(x,'%Y-%m-%d')), StringType()) 

df.withColumn('new', testudf('someDate')).show() 

Я не был успешным до сих пор, и было интересно, если кто-нибудь имеет лучше повезло.

Здесь ошибка я получаю:

typeError: in method 'DateParser_parseFormatted', argument 1 of type 'std::string const &' 
    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234) 
+0

.... и как, точно, у вас не было успеха ? –

+0

Каков точный тип 'x', который передается лямбда внутри' udf'? Это строка Python или некоторый тип Spark? –

+0

X будет искровой струной – ulrich

ответ

1

вывозится из C++, метод DateParser.parseFormatted является своим родом частности, о типах и не может взять Спарк строки x что UDF оборудования переходит к лямбде , Вам нужно будет преобразовать x обратно в строку Python внутри лямбда. Я не знаком с искрой и ее типов, но, возможно, str(x), как в

lambda x: str(DateParser.parseFormatted(str(x), '%Y-%m-%d')) 

может сделать работу?

В качестве примечания стороны, я не уверен, в чем смысл внешнего str в вашей лямбда. Вы берете строку, превращая ее в объект Date с помощью DateParser, а затем вы снова преобразуете результат в строку ...