#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