当数据包含具有两种不同数据类型的嵌套数组时,在 PySpark 中定义模式

Posted

技术标签:

【中文标题】当数据包含具有两种不同数据类型的嵌套数组时,在 PySpark 中定义模式【英文标题】:Defining a Schema in PySpark when the data contains a nested array with two different DataTypes 【发布时间】:2020-11-10 18:27:22 【问题描述】:

我正在尝试定义一个模式,以便从当前存储在 rdd 中的一些数据创建一个数据框。然而,rdd 包含一些数组,它们有两种不同的数据类型,整数和浮点数,因此我不确定如何定义模式。

来自相关文件的示例数据行

"a":"string","b":["c":[[0,1.04,1.99],[1,1.03,5.26],[2,1.02,6]],"d":0.0,"e":132]

目前我的架构是这样的

StructType([
    StructField('a', StringType(), True),
    StructField('b', ArrayType(
                StructType([
                    StructField('c', ArrayType(
                        ArrayType(DoubleType()
                                  ), True), True),
                    StructField('d', DoubleType(), 
                                True),
                    StructField('e', IntegerType(), 
                                True),
   ])
])

但是我收到了错误

DoubleType can not accept object 0 in type <class 'int'> 

...当我切换到整数类型时,反之亦然。

有没有办法在 PySpark 中包含这两种数据类型?

【问题讨论】:

【参考方案1】:

我不认为有办法在单个数组中包含混合类型。

在使用 Spark 读取它们之前,您可以尝试将输入字典的“c”子列表中的所有内部数字转换为浮点数。

def cast_dict(dictionary):
  for subdict in dictionary['b']:
      subdict['c'] = [list(map(float, sublist)) for sublist in subdict['c']]
  return dictionary

【讨论】:

以上是关于当数据包含具有两种不同数据类型的嵌套数组时,在 PySpark 中定义模式的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用具有不同数据类型的数组

使用 Relay 的嵌套表单组件 UI 中的状态应该在哪里?

异质的数据结构

怎么用一个数组储存两种数据类型,如int char

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中

yaml数组类型详解