如果函数返回字典数组,如何构造要与UDF一起使用的模式

时间:2017-09-27 14:22:40

标签: python dataframe pyspark

我正在尝试为下面提到的数据类型创建模式,它是与udf一起使用的字典列表,但我收到了下面提到的错误。

 Unexpected tuple %r with StructType

 [{'cumulativeDefaultbalance': 0, 'loanId': 13131, 'cumulativeEndingBalance': 4877.9918745262694, 'cumulativeContractpaymentw': 263.67479214039736, 'month': 1, 'cumulativeInterestpayment': 141.66666666666666, 'cumulativePrincipalpayment': 122.00812547373067, 'cumulativeAdjbeginingbal': 5000, 'cumulativePrepaymentamt': 40.315417142065087}]

以下是我正在构建的架构对象

schema = StructType([
            StructField('cumulativeAdjbeginingbal', FloatType(), False),
            StructField('cumulativeEndingBalance', FloatType(), False),
            StructField('cumulativeContractpaymentw', FloatType(), False),
            StructField('cumulativeInterestpayment', FloatType(), False),
            StructField('cumulativePrincipalpayment', FloatType(), False),
            StructField('cumulativePrepaymentamt', FloatType(), False),
            StructField('cumulativeDefaultbalance', FloatType(), False)
        ])

任何人都能说出我的代码失败的原因吗?

1 个答案:

答案 0 :(得分:1)

据我所知,问题是您定义的模式要求rdd元素采用列表而不是字典的形式。因此,您可以在创建DF之前执行此操作(假设您的dicts rdd的基本列表被称为df

df.map(lambda x: x.values)

或者您可以使用以下内容并消除显式模式定义:

from pyspark.sql import Row
df.map(lambda x: Row(**x)).toDF()

编辑:实际上看起来模式是针对UDF的返回类型。我认为以下内容应该有效:

from pyspark.sql.types import ArrayType

schema = ArrayType(StructType([
        StructField('cumulativeAdjbeginingbal', FloatType(), False),
        StructField('cumulativeEndingBalance', FloatType(), False),
        StructField('cumulativeContractpaymentw', FloatType(), False),
        StructField('cumulativeInterestpayment', FloatType(), False),
        StructField('cumulativePrincipalpayment', FloatType(), False),
        StructField('cumulativePrepaymentamt', FloatType(), False),
        StructField('cumulativeDefaultbalance', FloatType(), False)
    ]), False)