使用Quantlib函数的Pyspark UDF

时间:2017-02-14 16:17:52

标签: pyspark quantlib

我一直在尝试使用Quantlib和Spark,尝试在Pyspark中传递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)

1 个答案:

答案 0 :(得分:1)

从C ++导出时,DateParser.parseFormatted方法对于类型是特别的,并且不能将udf机制传递给lambda的Spark字符串x。您必须将x转换回lambda中的Python字符串。我不熟悉Spark及其类型,但也许str(x),如

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

可能会做这项工作吗?

作为旁注,我不确定你的lambda中外str的重点是什么。您正在使用字符串,通过Date将其转换为DateParser对象,然后您再次将结果转换为字符串...