【问题标题】:Convert RDD[Row] containing strings To Dataframe Of IntegerTypes将包含字符串的 RDD[Row] 转换为 IntegerTypes 的 Dataframe
【发布时间】:2020-08-24 08:10:07
【问题描述】:

我有以下 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?

【问题讨论】:

  • 我看到了那个帖子。它直接处理在 spark DF 中转换列类型,而不是在从 RDD 创建数据帧时转换列类型
  • 好的,您需要修改行的 RDD,以便在创建数据帧之前将所有这些字符串数据转换为整数。

标签: python apache-spark pyspark schema


【解决方案1】:

您应该在创建所需列类型的数据框之前修改行的 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))

【讨论】:

  • 我喜欢这个解决方案。也是这么想的。 pyspark 没有将这些列转换为您所需的类型,这有点糟糕……一旦我开始工作,就会将您的解决方案标记为正确。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2016-12-25
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多