我正在尝试为下面提到的数据类型创建模式,它是与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)
])
任何人都能说出我的代码失败的原因吗?
答案 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)