Получение ошибки при преобразовании RDD в DataFrame PySpark

Я изучаю Apache Spark и столкнулся с чем-то действительно странным. См. этот код ниже:

ClimateRdd = ClimateRdd.map(lambda x: tuple(x))
print ClimateRdd.first()

эти команды возвращают мне эту строку: ('1743-11-01', '4.3839999999999995', '2.294', '\xc3\x85land')

Затем я перемещаю это в dataFrame следующим образом:

schemaDf = sqlContext.createDataFrame(ClimateRdd, schema)
schemaDf.registerTempTable('globalTemp')
result = sqlContext.sql("SELECT dt FROM globalTemp")
result.show(5)

Это работает отлично, и я получил такой результат:

+----------+
|        dt|
+----------+
|1743-11-01|
|1743-12-01|
|1744-01-01|
|1744-02-01|
|1744-03-01|
+----------+
only showing top 5 rows

После того, как я возьму результат запроса и попытаюсь запустить строки:

dates = result.map(lambda x: "Datas: " + x.dt)
print dates.collect()

Я получил исключение java по этой причине: Caused by: java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 4 fields are required while 5 values are provided.

Ну, я провел много исследований и нашел, в чем проблема, я изменил свою первую часть кода на это:

ClimateRdd = ClimateRdd.map(lambda x: (x[0], x[1], x[2], x[3]))       

И это сработало!

Дело в том, почему первая часть не сработала? Почему я должен вручную генерировать кортеж? Есть ли способ создать этот кортеж динамически?


person Thiago Baldim    schedule 10.07.2016    source источник
comment
Похоже, у вас есть строка в ClimateRDD с более чем 4 элементами. Попробуйте сделать что-то вроде ClimateRdd.map(lambda x: (1, len(x)).countByValue(), и я ожидаю, что вы увидите строки с 5 элементами.   -  person santon    schedule 11.07.2016
comment
Попробуйте проверить, есть ли строка, содержащая более 4 элементов.   -  person KartikKannapur    schedule 12.07.2016
comment
Хм, в этом есть смысл! Я проверю свой набор данных и дам вам всем ответ. Из-за того, что если я конвертирую кортеж, он будет перебирать все данные в RDD, если их 4 или более... если сделать кортеж вручную, этого не произойдет. Я проверю набор данных, потому что я не знал, что у меня есть разные типы столбцов. Файл представляет собой CSV, возможно, название одного типа страны.   -  person Thiago Baldim    schedule 12.07.2016
comment
Да, @santon, ты был прав. В нескольких строках было более 4 столбцов: defaultdict(<type 'int'>, {(1, 5): 2277, (1, 4): 575185})   -  person Thiago Baldim    schedule 13.07.2016
comment
Была такая же проблема! Была пустая строка, и пришлось удалить пустую строку, включив код для фильтрации   -  person Senthil    schedule 26.12.2017


Ответы (2)


Проблема заключалась в грязных данных. Данных не было в параметре разделения по умолчанию. Проблема была там.

Когда я сделал преобразование кортежа, это предполагает, что структура имеет 4 поля в соответствии с большей частью данных. Но в одной конкретной строке это было не так.

Так что это причина, по которой мой фрейм данных падает при преобразовании кортежа.

person Thiago Baldim    schedule 25.09.2016

Это немного странно. Зачем вам кортежи? Список отлично работает с картой.

ClimateRdd.map(lambda x: [x[0], x[1], x[2], x[3]])       
person Alexis Benichoux    schedule 11.07.2016
comment
Списки хорошо работают, я это знаю. Моя точка зрения заключается в том, чтобы установить кортеж вручную. Но, согласно комментарию @santon. Вероятно, моя проблема заключается в размере RDD. - person Thiago Baldim; 12.07.2016