Определение схемы в PySpark, когда данные содержат вложенный массив с двумя разными типами данных

#python #apache-spark #pyspark #rdd

#python #apache-spark #pyspark #rdd

Вопрос:

Я пытаюсь определить схему, чтобы создать фрейм данных из некоторых данных, которые в настоящее время хранятся в 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:

Я не думаю, что есть способ иметь смешанные типы в одном массиве.

Вы можете попытаться преобразовать все внутренние числа в плавающие в подсписках ‘c’ входного словаря, прежде чем читать их с помощью Spark.

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