Я изучаю 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]))
И это сработало!
Дело в том, почему первая часть не сработала? Почему я должен вручную генерировать кортеж? Есть ли способ создать этот кортеж динамически?
ClimateRDD
с более чем 4 элементами. Попробуйте сделать что-то вродеClimateRdd.map(lambda x: (1, len(x)).countByValue()
, и я ожидаю, что вы увидите строки с 5 элементами. - person santon   schedule 11.07.2016defaultdict(<type 'int'>, {(1, 5): 2277, (1, 4): 575185})
- person Thiago Baldim   schedule 13.07.2016