Преобразование RDD [Row], содержащего строки, в Dataframe Of IntegerTypes - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующий RDD строк. Как видно, каждое поле является строковым типом

[Row(A='6', B='1', C='hi'),
 Row(A='4', B='5', C='bye'),
 Row(A='8', B='9', C='night')]

Я хочу преобразовать этот RDD в фрейм данных с IntegerTypes для столбцов A и B

dtypes = [
    StructField('A', IntegerType(), True),
    StructField('B', IntegerType(), True),
    StructField('C', StringType(), True)
]

df = spark.createDataFrame(rdd, StructType(dtypes))

Я получаю следующую ошибку:

TypeError: field A: IntegerType can not accept 
object '6' in type <class 'str'>

Как я могу успешно преобразовать '6' в IntegerType?

1 Ответ

1 голос
/ 08 мая 2020

Вы должны изменить RDD строк, прежде чем создавать фрейм данных желаемого типа столбца.

def modify_row(row):
    new_row = {}
    for key in row:
        if key in ['A', 'B']:
             new_row[key] = int(row[key])
        else:
             new_row[key] = row[key]
    return new_row

rdd = (sc.parallelize([Row(A='6', B='1', C='hi'),
                      Row(A='4', B='5', C='bye'),
                      Row(A='8', B='9', C='night')])
         .map(lambda x: modify_row(x)))

dtypes = [
    StructField('A', IntegerType(), True),
    StructField('B', IntegerType(), True),
    StructField('C', StringType(), True)
]

df = spark.createDataFrame(rdd, StructType(dtypes))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...