我一直在尝试使用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)
答案 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
对象,然后您再次将结果转换为字符串...